0

問題:

  • send()を呼び出すと、ソケット ハンドルに対してWinsock エラー10038が返されます

図:

acceptedSocket = accept (server, (sockaddr *)&sin, &len);
  • accept() 、 0を返します
    • 接続ごとに新しいスレッドが作成されます
    • send()、(スレッド関数内) は10038を返します

イラスト: - スレッド機能で

//omitted
SOCKET RemoteSocket = (SOCKET) client;
//omitted
send (RemoteSocket, stringToSpend, strlen(stringToSpend), 0)

提案:

  • 可能性、競合状態?
  • I/O 完了ポートを使用できますが、この段階では使用できません
4

3 に答える 3

2

行の問題ではありません

acceptedSocket = accept (server, (sockaddr *)&sin, &len) == INVALID_SOCKET)

比較の結果を作成acceptedSocketしますが、acceptから返された実際のソケットを何らかの方法で保存する必要があります。

acceptedSocket = accept (server, (sockaddr *)&sin, &len);
isOK= acceptedSocket!=INVALID_SOCKET;

あなたの投稿の括弧のバランスが悪いので少し混乱していますが、間違っているかもしれません

于 2009-02-23T14:52:19.777 に答える
2

accept() は、新しい接続固有のソケットへのハンドルを返します。サーバーコードの場合、2つ以上のソケットが関係しています.1つはaccept()を呼び出しているリッスン状態で、2つ目はaccept()から返されたものです-これは着信接続ソケットです。次の accept() は、2 番目の受信接続などのソケットを返すことができます。accept() が 0 を返す場合、それは受信接続ではなく、エラーです。

于 2009-02-23T14:43:27.070 に答える
0

うーん、起こるsend前にあなたの実行が速すぎるようです。acceptそのため、sendで使用されるソケットは、sendが実行された時点では無効です。マルチスレッドの厄介な機能の1つ。sendスレッドでイベントを待機し、受け入れが発生したときにイベントを発生させる必要があります

于 2009-02-23T14:50:48.300 に答える