1. ホーム
  2. c++

[解決済み] C++ Winsock 10093エラー

2022-02-14 07:43:37

質問

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

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()を呼んでいないことが原因だとネットで読みましたが、私はソケットのコンストラクタでそれを呼び、最初の1回で受け入れました。

どうすればいいですか?

10093は WSANOTINITIALISED ということは、どちらかというと WSAStartup() がまったく呼び出されていないか、あるいは WSACleanup() よりも多く呼び出されている。 WSAStartup() が呼び出されました。

ご提供いただいたコードに基づき、以下のようになります。 Socket::Accept() が返されます。 Socket の代わりに Socket* . もしそうなら Accept() は、一時的に Socket の直後でスコープ外になる。 Socket *socket が割り当てられています。 の可能性があります。 Socket デストラクタが WSACleanup() べきでないときに への呼びかけ WSAStartup()WSACleanup() は、常にバランスをとる必要があります。