0

このスレッドの SocketClient.cs を使用しましたが、msdn と非常によく似ています。

パケットを受信した後にバッファが空になる理由を誰か教えてもらえますか?

私はWindows 8でホストアプリケーションを使用しており、電話パケットから何らかの情報を送信しています。次に、ホストが新しいパケットで応答します。メソッド 'Receive' は空の情報を受け取ります。バッファが空です。それを修正する方法は?

4

1 に答える 1

0

SAEA オブジェクトの Completed イベントに反応していない場合、データは受信されていません。そうであれば、空のメッセージを受信したか、バッファサイズが 0 でした。これは、ドキュメントが伝えていることです。

リンクのコードを調べたところ、SendToAsync メソッドで ManualResetEvent を使用していることがわかりました。なぜこれを行っているのかはわかりませんが、指定されたタイムアウトによっては、1 つの原因である可能性があります。

誰もが SAEA オブジェクトのドキュメントを読んでいるわけではないと思いますが、これをスレッド同期オブジェクトと考える必要があります。スレッドに送信され、そこで作業を行い、終了を通知します。それだけです。おそらく、これはリンクされた投稿のコードの問題であり、SAEA オブジェクトからシグナルを受信する必要があるスレッドは、Reset メソッドが呼び出されるまでビジーです。その場合、別のスレッドで動作している SAEA オブジェクトからのイベントは通過していません。

また、呼び出し時に結果が利用可能な場合、SendToAsync はすぐに false を返す場合があることにも注意してください。すぐに結果を確認できます。したがって、次のように安全に呼び出すことができます

if (!_socket.SendToAsync(myEventArgs))
  ProcessResult(myEventArgs);

したがって、基本的な考え方は次のとおりです。SocketAsyncEventArgs を使用する場合は、スレッドを使用しないでください。Async ソケット メソッドは、スレッド化をユーザーに対して透過的にしようとします。この上にスレッド化レイヤーを追加するだけです。これはあなたを困らせる可能性があります。

于 2013-08-19T11:24:05.930 に答える