[解決済み] C++ Winsock 10093エラー
質問
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()
は、常にバランスをとる必要があります。
関連
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み】#include<iostream>は存在するのですが、「識別子 "cout "は未定義です」というエラーが出ます。なぜですか?
-
[解決済み】Enterキーを押して続行する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 unsigned int vs. size_t
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み】std::cin.getline( ) vs. std::cin
-
[解決済み】変数やフィールドがvoid宣言されている
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++