winsock编程超级详解.doc_第1页
winsock编程超级详解.doc_第2页
winsock编程超级详解.doc_第3页
winsock编程超级详解.doc_第4页
winsock编程超级详解.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Socket编程是网络编程的重要组成部分,编写简单的服务端程的程序的一般的步骤如下第一步:包含WinSocket的头文件和动态链接库(DLL)#include #include #pragma comment(lib,ws2_32)第二步:初始化WSAStartup 在MSDN中WSAStarup的原型如下:int WSAStartup( _in WORD wVersionRequested, _out LPWSADATA lpWSAData);其中的第一个参数是版本,第二个参数是一个指向WSADATA结构体的指针,代码如下:WORD Version = MAKEWORD(2,2); /通过MAKEWORD来设定版本,高版本和低版本都为2,也就是限定了版本必须为2WSADATA wsadata ; /结构体的一个成员 wsadata/初始化并判断是不是成功,如果成功的话返回的是0,不成功的话返回的值为非0,那么就要使用WSAleanup()函数了if(WSAStartup(Version,&wsadata)coutWSAStartup Error!endl;WSACleanup();第三部,初始化一个Socket,在MSDN中socket的原型如下SOCKET WSAAPI socket( _in int af, _in int type, _in int protocol);其中第一个参数为网络层协议类型,第二个参数为socket类型,第三个参数为传输层的协议类型,代码如下:/第一个参数多数时候为AF_INET,第二个参数可以为SOCK_STREAM适用于可信连接,也就是tcp链接,或者为SOCK_DGRAM,适用于UDP协议第三个参数为传输层协议,如果第二个参数为SOCK_STREAM,这里就为IPPROTO_TCP,如果是SOCK_DGRAM,这里就为IPPROTO_UDPSOCKET ServerSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(ServerSocket =INVALID_SOCKET) coutSocket Failendl;第四步:bind在MSDN中bind的定义如下:int bind( _in SOCKET s, _in const struct sockaddr* name, _in int namelen);第一个参数一个已经初始化的socket,第一个参数为执行sockaddr或者是sockaddr_in的结构体的起始地址,第三个参数为结构体的大小,代码如下:sockaddr_in ServerAddr;/定义一个结构体成员,这里使用的是sockaddr_in结构体ServerAddr.sin_family=AF_INET;/初始化成员的sin_family为AF_INETServerAddr.sin_addr.S_un.S_addr=INADDR_ANY;/允许任意的IP地址进行连接ServerAddr.sin_port=htons(2012);/侦听端口为2012,这里使用了htons函数/这里需要说明的是需要对第二个参数进行强制类型转换,(LPSOCKADDR)&ServerAddr,并且判断是不是bind成功,成功后返回的是为0if(bind(ServerSocket,(LPSOCKADDR)&ServerAddr,sizeof(ServerAddr) coutbind Failendl;第五步:侦听在MSDN中listen的原型如下:int listen( _in SOCKET s, _in int backlog);依然第一个参数为初始化了的socket,第二个参数为最大允许的连接数,代码如下:/这里依然使用的是上面的socket:ServerSocketif(listen(ServerSocket,5) coutlisten Failendl;第六步:accept在MSDN中原型如下:SOCKET accept( _in SOCKET s, _out struct sockaddr* addr, _inout int* addrlen);第一个参数一个新的客户端的Socket,这里需要定义一个,第二个参数依然为执行sockaddr或者是sockaddr_in的结构体的首地址,第三个参数为长度,这里accept负责对新定义的socket进行初始化,如果成功accept返回的一个可用的sokcet。代码如下:sockaddr_in Clientaddr;/定义一个结构体成员SOCKET ClientSocket;/定义一个socket用于接收accept的返回值int lAddrlen=sizeof(Clientaddr);/获取结构体的长度while(TRUE)/因为要一直的侦听,所以这里使用无限循环ClientSocket=accept(ServerSocket,(LPSOCKADDR)&Clientaddr,&lAddrlen);/与上面类似,需要强制转换,第一个参数为已经初始化的socketif(ClientSocket=INVALID_SOCKET)coutaccept Failendl;elsecout接受到一个信息endl;第七步:如果accept成功,recv消息在MSDN中recv原型如下:int recv( _in SOCKET s, _out char* buf, _in int len, _in int flags);第一个参数为accept返回的socket,第二个参数为输出接收的消息的一个指针,第三个为消息的长度,第四个为标志,设定接收数据的方式,代码如下:char RecvMessage1024; /判断是不是成功接收,成功接收返回的是接收的数据的长度,if(recv(ClientSocket,RecvMessage,1024,0)coutrecv Message Failendl;第八步:(可选):回复客户端消息 sendsend在MSDN中的代码如下:int send( _in SOCKET s, _in const char* buf, _in int len, _in int flags);第一个参数为accept返回的socket,第二个参数为内容的开始地址,第三个为长度,第四个为发送的方式,代码如下:char * Message =HellO Client!; /判断是不是成功发送,成功发送返回的是发送的字节数,if(send(ClientSocket,Message,strlen(Message),0)coutsend Message Failendl;第九步:完成后,关闭客户端与服务端的socket:closesocket(ClientSocket);/上面while的结束部分第十步:“清理”现场:closesocket(ServerSocket);WSACleanup();return 0;总结下,代码如下:#include #include #pragma comment(lib,ws2_32)using namespace std;int main(int argc,char argv)WORD Version = MAKEWORD(2,2);WSADATA wsadata ;if(WSAStartup(Version,&wsadata)coutWSAStartup Error!endl;WSACleanup();SOCKET ServerSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(ServerSocket =INVALID_SOCKET)coutSocket Failendl;sockaddr_in ServerAddr;ServerAddr.sin_family=AF_INET;ServerAddr.sin_addr.S_un.S_addr=INADDR_ANY;ServerAddr.sin_port=htons(2012);if(bind(ServerSocket,(LPSOCKADDR)&ServerAddr,sizeof(ServerAddr)coutbind Failendl;if(listen(ServerSocket,5)coutlisten Failendl;sockaddr_in Clientaddr;SOCKET ClientSocket;int lAddrlen=sizeof(Clientaddr);while(TRUE)ClientSocket=accept(ServerSocket,(LPSOCKADDR)&Clientaddr,&lAddrlen);if(ClientSocket=INVALID_SOCKET)coutaccept Failendl;elsecout接受到一个信息endl;char RecvMessage1024;if(recv(ClientSocket,RecvMessage,1024,0)0)coutrecv Message Failendl;char * Message =HellO Client!;if(send(ClientSocket,Message,strlen(Message),0)0)coutsend Message Failendl;closesocket(ClientSocket);closesocket(ServerSocket);WSACleanup();return 0;-前面的文章有详细的介绍过服务端的编程,在客户端的代码的实现相对于服务端的代码要简单些,客户端可以通过IP地址直接连接,也可以通过静态域名或者是3322动态域名来连接服务器,下面是具体的代码的实现第一步 包含头文件和DLL#include #include #pragma comment(lib,ws2_32)第二步 初始化WSAStartupWORDwVersion = MAKEWORD(2,2);WSADATA ClientData;if(WSAStartup(wVersion,&ClientData)coutWSAStartup Failh_addr_list0);第四步 connect 连接服务器sockaddr_in Clientaddr;Clientaddr.sin_port = htons(2012);Clientaddr.sin_addr.S_un.S_addr = inet_addr(IP);/inet_addr(),参数为一个字符串,将IP字符串的地址传递给inet_addrClientaddr.sin_family =AF_INET;if(connect(ClientSocket,(LPSOCKADDR)&Clientaddr,sizeof(Clientaddr) coutconnect Failendl; /如果连接失败,释放资源 closesocket(ClientSocket); WSACleanup(); return0;第五步 send 发送消息char* buff =Hello Server!;if(send(ClientSocket,buff,strlen(buff),0)0) coutsend Failendl;else coutsend Successendl;第六步 recv 接收消息char RecMessage1024;intMessageLen=recv(ClientSocket,RecMessage,1024,0);if(MessageLen0) coutrecv Failendl;else /*通过recv获取的长度为MessageLen,那么将数组的地MessageLen的值置为0,也就是给 字符串数组加上一个结束符,那么cout遇到结束符就能停止输出了,免去了使用for循环,提高了 程序的执行效率*/RecMessageMessageLen=0x00;coutRecMessgeendl;第七步 释放资源closesocket(ClientSocket);WSACleanup();1/*备注:如果想要实现连接上了服务器后与服务器进行不间断的交流的话,只需要将send和recv重写为两个函数,通过向函数传递socket来实现简单的交流的目的*/完整的代码如下:#include #include #include #pragma comment(lib,ws2_32)usingnamespacestd;intmain(intargc,charargv)WORDwVersion = MAKEWORD(2,2);WSADATA ClientData;if(WSAStartup(wVersion,&ClientData)coutWSAStartup Failendl;SOCKET ClientSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(ClientSocket=INVALID_SOCKET) coutsocket Failh_addr_list0);sockaddr_in Clientaddr;Clientaddr.sin_port = htons(2012);Clientaddr.s

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论