服务器端代码
#define FD_SETSIZE 500 #include<winsock2.h> #pragma comment(lib,"WS2_32") #include<stdio.h> void main() { printf("............服务器.....................\n"); WORD wVersionRequested =MAKEWORD(2,2); WSADATA wsaData; if(WSAStartup(wVersionRequested,&wsaData)!=0) { printf("WSAStartup Failed\n"); printf("WSAStartup error=%d\n",WSAGetLastError()); } else { printf("加载成功\n"); printf("版本号:%x\n",wsaData.wVersion); printf("最高版本号:%x\n",wsaData.wHighVersion); printf("库说明字符串:%s\n",&wsaData.szDescription[0]); printf("配置说明字符串:%s\n",&wsaData.szSystemStatus[0]); } SOCKET s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if(s==INVALID_SOCKET) { printf("Failed socket\n"); printf("socket Error=%d\n",WSAGetLastError()); } else printf("套接口成功建立,套接口号:[%u]\n",s); u_long ul=0; ioctlsocket(s,FIONBIO,(u_long*)&ul); sockaddr_in Sadd; Sadd.sin_family=AF_INET; Sadd.sin_port=htons(5555); Sadd.sin_addr.S_un.S_addr=inet_addr("127.0.0.1"); if(bind(s,(sockaddr*)&Sadd,sizeof(Sadd))==SOCKET_ERROR) { printf("Failed bind\n"); printf("bind Error=%d\n",WSAGetLastError()); } else { printf("绑定成功\n"); printf("本地ip地址:[%s],本地端口号:[%u]\n",inet_ntoa(Sadd.sin_addr),ntohs(Sadd.sin_port)); } if(listen(s,2)==SOCKET_ERROR) { printf("Failed listen\n"); printf("listen Error=%d\n",WSAGetLastError()); } else printf("进入监听状态\n"); int x=1; timeval tv; tv.tv_sec=20; tv.tv_usec=0; fd_set socket_jh1; FD_ZERO(&socket_jh1); FD_SET(s,&socket_jh1); fd_set socket_jh2; FD_ZERO(&socket_jh2); while(true) { socket_jh2=socket_jh1; int sock_sum=select(0,&socket_jh2,NULL,NULL,&tv); if(sock_sum>0) { for(int i=0;i<(int)socket_jh2.fd_count;i++) { if(socket_jh2.fd_array[i]==s) { if(socket_jh1.fd_count<FD_SETSIZE) { sockaddr_in Cadd; int Cadd_len=sizeof(Cadd); SOCKET sNew=accept(s,(sockaddr*)&Cadd,&Cadd_len); FD_SET(sNew,&socket_jh1); printf("接受一个客户端连接,对方地址:【%s】,端口号:【%d】\n",inet_ntoa(Cadd.sin_addr),ntohs(Cadd.sin_port)); printf("分配给该客户端的套接口为:%d\n\n",sNew); } else { printf("连接数量太多\n"); continue; } } else { char cbuf[256]; memset(cbuf,0,256); int cRecv; cRecv=recv(socket_jh2.fd_array[i],cbuf,256,0); if(cRecv==SOCKET_ERROR) { printf("可能客户端%d非法关闭!",socket_jh2.fd_array[i]); printf("或者调用recv() Failed,Error=【%d】\n",WSAGetLastError()); closesocket(socket_jh2.fd_array[i]); FD_CLR(socket_jh2.fd_array[i],&socket_jh1); } else if(cRecv>0) { printf("接受到来自【%d】的数据:%s\n",socket_jh2.fd_array[i],cbuf); int isend; char sbuf[]="Hello client!I am server"; isend=send(socket_jh2.fd_array[i],sbuf,sizeof(sbuf),0); if(isend==SOCKET_ERROR) { printf("send() Failed,Error=【%d】\n",WSAGetLastError()); break; } else if(isend<=0) { printf("消息发送失败!\n"); break; } else printf("给客户端【%d】信息已发送,信息长度%d字节\n\n",socket_jh2.fd_array[i],isend); } else { printf("客户端【%d】不再发送数据,正常关闭连接,为客户端连接创建的套接口将关闭!\n",socket_jh2.fd_array[i]); closesocket(socket_jh2.fd_array[i]); FD_CLR(socket_jh2.fd_array[i],&socket_jh1); } } } } else if(sock_sum==0) { printf("第【%d】次超时\n",x); if(x<3) { x++; continue; } else { printf("超时等待限制,退出程序\n"); break; } } else { printf("select() Failed,Error=【%d】\n",WSAGetLastError()); break; } } closesocket(s); printf("退出\n"); WSACleanup(); }