3

複数のクライアントを受け入れることができるサーバーを C++ で構築しようとしています。その目的のために、私は winsock ラッパーを構築し、各クライアントの通信にブースト付きスレッドを使用しました。
クライアントを受け入れようとしたときに奇妙な問題が発生しました。次のようなループがあります。

int clientID = 0;
listenSocket = new Socket(SocketType::TCP);
listenSocket->Bind(port);
listenSocket->Listen();

while(running)
{
    Socket *socket = &listenSocket->Accept();
    mutex.lock();
    clients.push_back(new Client(socket,  clientID));
    mutex.unlock();

    std::cout << "Client with id " << clientID << " connected!" << std::endl;

    std::cout << WSAGetLastError() << std::endl;

    clientID++;
}

これで、最初のクライアントは正常に受け入れられ、WSAGetLastError() は 0 を返しますが、最初のクライアントが接続された後、別のクライアントに接続しようとしなくても、コンソール 10093 に書き込み続けるだけです。これは、ループ内の Accept() がブロックを停止したことを意味します。そしてなぜかちゃんと受け付けない。WSAStartup() を呼び出さないことによってこのエラーが発生したことをオンラインで読みましたが、ソケットのコンストラクターで呼び出して、初めて受け入れました。

4

2 に答える 2

11

クロスプラットフォームソケットアプリケーションのプログラミング中に、まったく同じ問題が発生しました。Linux と OS X では正常に動作していましたが、Windows ではこのエラー 10093 が発生していました。これを修正するには、winsock 関数を呼び出す前に次のコードを追加します。

    #ifdef WIN32
        // Initialize Winsock
        int iResult;
        WSADATA wsaData;
        iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
        if (iResult != 0) {
            std::cout << "WSAStartup failed: " << iResult << std::endl;
            return;
        }
    #endif
于 2017-01-18T00:40:50.870 に答える