select连接TCPIP数据收发测试(连接多客户)

来源:互联网 发布:华彬快销品网络商学院 编辑:程序博客网 时间:2024/06/07 06:36


下面给出一个简单的select模型的服务端套接字,非阻塞模式。可以连接多个客户端,没连接1个客户接收100MB数据后,返回OK退出。


bool InitAndListen(SOCKET &sListen){sockaddr_in local;local.sin_family = AF_INET;local.sin_addr.s_addr = INADDR_ANY;local.sin_port = htons((u_short)TCPSERVER_PORT);//Initial socketsListen = socket(AF_INET, SOCK_STREAM, 0);if (sListen == INVALID_SOCKET){printf("Initial socket failed\n");return 0;}//Bind socketif (bind(sListen, (sockaddr*)&local, sizeof(local)) != 0){printf("Bind socket failed\n");return 0;}if (listen(sListen, 10) != 0)  //Listen socket{printf("Listen socket failed");return 0;}return 1;}int SelectTcpRecver(){SOCKET sListen;if (0 == InitAndListen(sListen))return -1;printf("Sever:%d wait for client connect ...\n", TCPSERVER_PORT);fd_set fdSocket;FD_ZERO(&fdSocket);FD_SET(sListen, &fdSocket);while (1){fd_set fdRead = fdSocket;int nRet = select(NULL, &fdRead, NULL, NULL, NULL);if (nRet <= 0){printf("Select failed\n");break;}for (int i = 0; i < (int)fdSocket.fd_count; i++){if (fdSocket.fd_array[i] == sListen){sockaddr_in addrRemote;int AddrLen = sizeof(addrRemote);SOCKET sNew = ::accept(sListen, (sockaddr *)&addrRemote, &AddrLen);FD_SET(sNew, &fdSocket);//将套接字sNew放到fdSocket中printf("Client %s connected\n", inet_ntoa(addrRemote.sin_addr));}else{char * Buffer = (char *)malloc(MB100);if (NULL == Buffer){printf("100MB 内存分配失败!\n");return -1;}DWORD nRemainRecv = MB100;char * pBuf = (char *)Buffer;int len, ret;//接收100MB的数据while (nRemainRecv > 0){len = recv(fdSocket.fd_array[i], pBuf, nRemainRecv, 0);if (len < 0){printf("Recv HeadDate Fail:%d\n", len);break;}else if (len == 0){printf("Pre len is 0 client quit!\n");break;}printf("接收数据:%d\n", len);nRemainRecv -= len;pBuf += len;}free(Buffer);printf("共接收数据:%d\n", MB100);char   szBuff[8];sprintf_s(szBuff, _countof(szBuff), "%s", "OK");ret = send(fdSocket.fd_array[i], szBuff, (int)strlen(szBuff), 0);if (ret == 0)printf("send 0\n");else if (ret == SOCKET_ERROR){printf("send() failed: %d\n", WSAGetLastError());}closesocket(fdSocket.fd_array[i]);FD_CLR(fdSocket.fd_array[i], &fdSocket);}//End For}//End while}return 0;}
发送端和上遍博客一样

0 0
原创粉丝点击