首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++中的Winsock服务器在三个客户端后拒绝连接

C++中的Winsock服务器在三个客户端后拒绝连接
EN

Stack Overflow用户
提问于 2016-05-17 20:33:08
回答 1查看 110关注 0票数 0

我正在用C++编写一个Winsock服务器,它从模拟到数字转换器收集数据,并运行服务器,以便客户端可以登录并请求数据。我目前让它至少运行三个线程(主线程、模拟输入线程和服务器线程),加上服务器为每个连接的客户端派生一个新线程。我现在正在测试代码,它接受来自客户端的三次连接,但在第四次尝试时拒绝连接。这是我用来为每个客户端接收连接和分离线程的while循环。当服务器拒绝连接时,它仍然处于这个循环中。我从一些调试printf语句中知道。

代码语言:javascript
复制
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语句都是我正在设置的与客户通信的协议。我使用的测试器客户端代码关闭了客户端的套接字。我读过一些其他的帖子,其中说这有时是问题所在,但在这种情况下似乎不是问题所在。有什么想法吗?

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-17 22:00:27

它在第一个连接线程退出后开始拒绝连接,因为您在线程中错误地调用了WSACleanup()。把它移开。您还应该从accept循环中删除它。只有当您准备退出整个进程时,才应该调用它。

注意,您正在接受循环中测试错误的套接字。

注2您的代码做了一个无法成立的假设,即每个recv()都接收到一条完整的消息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37285774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档