为了更容易理解,我们举一个小例子来说明服务器与客户端之间的连接过程。
有一个饭店,饭店里有服务员,服务员用于招待客人
特别要注意的是:要记住相关函数的各个参数都是什么,什么时候返回SOCKET_ERROR,什么时候返回INVALID_SOCKET
服务器
1 1 #include<stdio.h> 2 2 #include<winsock2.h> 3 3 #pragma comment(lib,"ws2_32.lib") 5 int main() 4 6 { 5 7 //初始化wsa 6 8 WORD wVersionRequested; 7 9 WSADATA wsaData; 810 int err; 911 wVersionRequested = MAKEWORD(2, 2); 1012 1113 err = WSAStartup(wVersionRequested, &wsaData); 1214 if (err != 0) 1315 { 1416 1517 printf("WSAStartup failed with error: %d\n", err); 1618 return 1; 1719 } 1820 1921 if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) 2022 { 2123 2224 printf("Could not find a usable version of Winsock.dll\n"); 2325 WSACleanup(); 2426 return 1; 2527 } 2628 else 2729 printf("The Winsock 2.2 dll was found okay\n"); 2830 2931 SOCKET sever; 3032 SOCKET waiter;//服务员用于招待客人 3133 struct sockaddr_in severaddr; 3234 struct sockaddr_in clientaddr;37 //创建套接字---创建饭店 3338 sever=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 3439 if(sever==INVALID_SOCKET) 3540 { 3641 WSACleanup(); 3742 return 1; 3843 } 3944 /*if(sever=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)==INVALID_SOCKET) 4045 { 4146 WSACleanup(); 4247 return 1; 4348 }*///这么写会导致绑定失败?? 4449 //绑定---相当于拉客,把客人拉进屋子 4550 severaddr.sin_family=AF_INET; 4651 severaddr.sin_port=htons(1234); 4752 severaddr.sin_addr.S_un.S_addr=inet_addr("192.168.202.1"); 4853 4954 if(bind(sever,(const sockaddr*)&severaddr,sizeof(severaddr))==SOCKET_ERROR) 5055 { 5156 WSACleanup(); 5257 closesocket(sever); 5358 return 1; 5459 } //监听----看客人有没有要点餐的 5560 if(listen(sever,4)==SOCKET_ERROR) 5661 { 5762 WSACleanup(); 5863 return 1; 5964 } 6065 printf("等待连接...\n"); 6166 int clientlen=sizeof(clientaddr); //接收 6267 waiter=accept(sever,(SOCKADDR*)&clientaddr,&clientlen);//如果有要点餐的,派一个服务员去,将客户的地址信息传给店长 6368 if(waiter==INVALID_SOCKET)//第一个参数为监听套接字 6469 { 6570 printf("接受失败\n"); 6671 WSACleanup(); 6772 closesocket(sever); 6873 return 1; 6974 } 7075 while(1) 7176 { 7277 char recvbuf[1024]={0};//接受缓冲区 7378 char sendbuf[1024]={0};//发送缓冲区 7479 if(recv(waiter,recvbuf,sizeof(recvbuf),0)==SOCKET_ERROR)//服务员去负责收客户信息 7580 { //waiter去收 7681 printf("接受数据失败\n"); 7782 } 7883 printf("%s\n",recvbuf); 7984 scanf("%s",sendbuf); 8085 send(waiter,(char *)sendbuf,sizeof(sendbuf),0);//waiter去send 8186 } 8287 WSACleanup(); 8388 closesocket(sever); 8489 closesocket(waiter); 8590 return 0; 8691 }
客户端
1 1 #include<iostream> 2 2 #include <winsock2.h> 3 3 4 4 using namespace std; 5 5 #pragma comment(lib, "ws2_32.lib") 6 6 7 7 int main() 8 8 { 9 9 WORD wVersionRequested; 1010 WSADATA wsaData; 1111 int err; 1212 wVersionRequested = MAKEWORD(2, 2); 1313 1414 err = WSAStartup(wVersionRequested, &wsaData); 1515 if (err != 0) 1616 { 1717 1818 printf("WSAStartup failed with error: %d\n", err); 1919 return 1; 2020 } 2121 2222 if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) 2323 { 2424 2525 printf("Could not find a usable version of Winsock.dll\n"); 2626 WSACleanup(); 2727 return 1; 2828 } 2929 else 3030 printf("The Winsock 2.2 dll was found okay\n"); 3131 3232 3333 //创建socket 3434 SOCKET sockClient=socket(AF_INET,SOCK_STREAM ,IPPROTO_TCP ); 3535 if(INVALID_SOCKET ==sockClient) 3636 { 3737 WSACleanup(); 3838 return 1; 3939 } 4040 //连接服务器 4141 sockaddr_in severaddr; 4242 severaddr.sin_family=AF_INET; 4343 severaddr.sin_port=htons(1234); 4444 severaddr.sin_addr.S_un.S_addr=inet_addr("192.168.202.1"); 4545 if(connect(sockClient,(const sockaddr*)&severaddr,sizeof(severaddr))==SOCKET_ERROR) 4646 {//客户端去连,连接服务器地址 4747 WSACleanup(); 4848 closesocket(sockClient); 4949 return 1; 5050 } 5151 while(1) 5252 { 5353 char szbuf[1024]={0}; 5454 cin>>szbuf; 5555 send(sockClient,szbuf,sizeof(szbuf),0);//客户端发送 5656 int nReNum=recv(sockClient,szbuf,sizeof(szbuf),0);//客户端接收 5757 if( nReNum>0) 5858 { 5959 cout<<szbuf<<endl; 6060 } 6161 } 6262 WSACleanup(); 6363 closesocket(sockClient); 6464 return 0; 6565 }