複数のクライアントを受け入れることができるサーバーを 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() を呼び出さないことによってこのエラーが発生したことをオンラインで読みましたが、ソケットのコンストラクターで呼び出して、初めて受け入れました。