-1

我正在尝试创建简单的 C++ 服务器客户端应用程序,它允许多个用户连接到服务器。问题是在为每个客户端创建新线程后,recv 函数开始使客户端应用程序崩溃。

这是我为每个连接的客户端创建新线程的代码:

while (ClientSocket = accept(ListenSocket, 0, 0)) {
        if (ClientSocket == INVALID_SOCKET) {
            printf("\ninvalid client socket", GetLastError());
            continue;
        }
        unsigned threadID;
        HANDLE myhandleB = (HANDLE) _beginthreadex(NULL, 0, &Server::receiveMessageThread, (void *) &ClientSocket, 0,
                                                   &threadID);
    }

这是一种尝试从服务器接收消息的方法:

void waitForMessage() {
    iResult = shutdown(ConnectSocket, SD_SEND);
    if (iResult == SOCKET_ERROR) {
        printf("shutdown failed with error: %d\n", WSAGetLastError());
        closesocket(ConnectSocket);
        WSACleanup();
    }

    do {
        iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);
        if ( iResult > 0 )
            printf("Bytes received: %d\n", iResult);
        else if ( iResult == 0 )
            printf("Connection closed\n");
        else
            printf("recv failed with error: %d\n", WSAGetLastError());

    } while( iResult > 0 );
}

调用后:

iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);

客户端应用程序停止响应。

4

1 回答 1

1

您的所有客户端线程都在接收指向同一个 SOCKET变量的指针,因此它们将相互践踏。您需要将 的副本传递SOCKET给每个线程。

如果成功,您还会泄漏返回的HANDLE,如果失败则_beginthreadex()泄漏接受的。SOCKET

试试这个:

// make sure this is declared as 'static' in the 'Server' class declaration...
unsigned __stdcall Server::receiveMessageThread(void *arg)
{
    SOCKET ClientSocket = (SOCKET) arg;
    ...
    closesocket(ClientSocket);
    return 0;
}

...

while (true)
{
    ClientSocket = accept(ListenSocket, 0, 0);
    if (ClientSocket == INVALID_SOCKET)
    {
        printf("\ninvalid client socket", GetLastError());
        continue;
    }
    unsigned threadID;
    HANDLE myhandleB = (HANDLE) _beginthreadex(NULL, 0, &Server::receiveMessageThread, (void *) ClientSocket, 0, &threadID);
    if (myhandleB)
        CloseHandle(myhandleB);
    else
        closesocket(ClientSocket);      
}
于 2018-07-08T02:42:32.480 回答