我正在用C++编写一个Winsock服务器,它从模拟到数字转换器收集数据,并运行服务器,以便客户端可以登录并请求数据。我目前让它至少运行三个线程(主线程、模拟输入线程和服务器线程),加上服务器为每个连接的客户端派生一个新线程。我现在正在测试代码,它接受来自客户端的三次连接,但在第四次尝试时拒绝连接。这是我用来为每个客户端接收连接和分离线程的while循环。当服务器拒绝连接时,它仍然处于这个循环中。我从一些调试printf语句中知道。
while (serverActive) {
//Accept client sockets as long as the server remains active
ClientSocket = accept(ListenSocket, NULL, NULL);
if (ListenSocket == INVALID_SOCKET) {
printf("Accept failed");
closesocket(ListenSocket);
WSACleanup();
return 1;
}
std::thread clientThr(clientHandlerThread, ClientSocket);
clientThr.detach();
}这是客户端处理程序线程的代码。所有在中间的if- All with语句都是我正在设置的与客户通信的协议。我使用的测试器客户端代码关闭了客户端的套接字。我读过一些其他的帖子,其中说这有时是问题所在,但在这种情况下似乎不是问题所在。有什么想法吗?
int clientHandlerThread(SOCKET client) {
int iResult, iSendResult;
char recvbuf[DEFAULT_BUFLEN];
int recvbuflen = DEFAULT_BUFLEN;
char * p_m6 = reinterpret_cast< char *>(&data_ai_SC1Mod6[0]);
char * p_m7 = reinterpret_cast< char *>(&data_ai_SC1Mod7[0]);
char * p_m8 = reinterpret_cast< char *>(&data_ai_SC1Mod8[0]);
//Receive data until the client closes the connection
do {
iResult = recv(client, recvbuf, recvbuflen, 0);
if (iResult > 0) {
recvbuf[iResult] = (char)0;
printf("Received Command: ");
printf(recvbuf);
printf("\n");
if (recvbuf[4] == 'V') {
if (recvbuf[6] == '6') {
iSendResult = send(client, "SCXI>", 5, 0);
iSendResult = send(client, p_m6, 64, 0);
iSendResult = send(client, "<SCXI", 5, 0);
}
else if (recvbuf[6] == '7') {
iSendResult = send(client, "SCXI>", 5, 0);
iSendResult = send(client, p_m7, 64, 0);
iSendResult = send(client, "<SCXI", 5, 0);
}
else if (recvbuf[6] == '8') {
iSendResult = send(client, "SCXI>", 5, 0);
iSendResult = send(client, p_m8, 64, 0);
iSendResult = send(client, "<SCXI", 5, 0);
}
else {
iSendResult = send(client, "SCXI>Unrecognized Module<SCXI", 29, 0);
}
}
else {
iSendResult = send(client, "SCXI>Unrecognized Command<SCXI", 30, 0);
}
if (iSendResult == SOCKET_ERROR) {
printf("Send failed");
closesocket(client);
WSACleanup();
return 1;
}
}
else {
closesocket(client);
WSACleanup();
return 1;
}
} while (iResult > 0);
closesocket(client);
WSACleanup();
return 0;
}发布于 2016-05-17 22:00:27
它在第一个连接线程退出后开始拒绝连接,因为您在线程中错误地调用了WSACleanup()。把它移开。您还应该从accept循环中删除它。只有当您准备退出整个进程时,才应该调用它。
注意,您正在接受循环中测试错误的套接字。
注2您的代码做了一个无法成立的假设,即每个recv()都接收到一条完整的消息。
https://stackoverflow.com/questions/37285774
复制相似问题