请大虾们帮看下这出了什么问题
//开启多个客户端时能通信,但只要关了一个后,就不能通信了,这是怎么回事?谢谢各位了
//Server
- C/C++ code
#include <winsock.h> #include <iostream> using namespace std;#define PORT 5150 #define MSGSIZE 1024 #pragma comment(lib, "ws2_32.lib") int g_iTotalConn = 0; SOCKET g_CliSocketArr[FD_SETSIZE]; SOCKET sListen; fd_set fdread; DWORD WINAPI WorkerThread(LPVOID lpParam); int main(int argc, char* argv[]) { WSADATA wsaData; SOCKADDR_IN local; DWORD dwThreadId; // Initialize windows socket library WSAStartup(0x0202, &wsaData); // Create listening socket sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // Bind local.sin_family = AF_INET; local.sin_addr.S_un.S_addr = htonl(INADDR_ANY); local.sin_port = htons(PORT); bind(sListen, (sockaddr*)&local, sizeof(SOCKADDR_IN)); // Listen listen(sListen, 3); // Create worker thread CreateThread(NULL, 0, WorkerThread, NULL, 0, &dwThreadId); int i; int ret; struct timeval tv = {1, 0}; char szMessage[MSGSIZE]; while (TRUE) { FD_ZERO(&fdread); for(i=0; i<g_iTotalConn; i++) { FD_SET(g_CliSocketArr[i], &fdread); } // We only care read event ret = select(0, &fdread, NULL, NULL, &tv); if (ret == 0) { // Time expired continue; } for (i = 0; i < g_iTotalConn; i++) { if (FD_ISSET(g_CliSocketArr[i], &fdread)) { // A read event happened on g_CliSocketArr ret = recv(g_CliSocketArr[i], szMessage, MSGSIZE, 0); if (ret == 0 || (ret == SOCKET_ERROR && WSAGetLastError() == WSAECONNRESET)) { // Client socket closed printf("Client socket %d closed.\n", g_CliSocketArr[i]); // FD_CLR(g_CliSocketArr[i], &fdread); // closesocket(g_CliSocketArr[i]); if(i<g_iTotalConn-1) { g_CliSocketArr[i] = g_CliSocketArr[g_iTotalConn-1]; } g_iTotalConn--; cout<<"g_iTotalConn:"<<g_iTotalConn<<endl; } else //根据客户要求查询,并返回结果 { // We reveived a message from client szMessage[ret] = '\0'; send(g_CliSocketArr[i], szMessage, strlen(szMessage), 0); } } } } return 0; } DWORD WINAPI WorkerThread(LPVOID lpParam) { while (TRUE) { int iAddrSize = sizeof(SOCKADDR_IN); SOCKET sClient; SOCKADDR_IN client; // Accept a connection sClient = accept(sListen, (sockaddr*)&client, &iAddrSize); printf("Accepted client:%s:%d\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port)); // Add socket to g_CliSocketArr g_CliSocketArr[g_iTotalConn++] = sClient; FD_SET(g_CliSocketArr[g_iTotalConn-1], &fdread); }}
//Client
- C/C++ code
#include <WINSOCK2.H> #include <stdio.h> #pragma comment(lib, "ws2_32.lib") #define SERVER_ADDRESS "127.0.0.1" #define PORT 5150 #define MSGSIZE 1024 int main(int argc, char* argv[]) { WSADATA wsaData; SOCKET sClient; SOCKADDR_IN server; char szMessage[MSGSIZE]; int ret; // Initialize windows socket library WSAStartup(0x0202, &wsaData); // Create client socket sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // Connect to server memset(&server, 0, sizeof(SOCKADDR_IN)); server.sin_family = AF_INET; server.sin_addr.S_un.S_addr = inet_addr(SERVER_ADDRESS); server.sin_port = htons(PORT); connect(sClient, (sockaddr*)&server, sizeof(SOCKADDR_IN)); while (TRUE) { printf("Send:"); gets(szMessage); // Send message send(sClient, szMessage, strlen(szMessage), 0); // Receive message ret = recv(sClient, szMessage, MSGSIZE, 0); szMessage[ret] = '\0'; printf("Received [%d bytes]: '%s'\n", ret, szMessage); } // Clean up closesocket(sClient); WSACleanup(); return 0; }
[解决办法]
编译运行你的程序,没有任何问题啊。即使多个客户端同时开启的情况下,关闭其中一个,还是可以正常通信的。
只是你的程序一直是死循环,要退出就只有Ctrl+C了。
你程序的功能相当于:client发送内容到server,server再发送回来,client接收到消息后,再发送数据。如此循环。