6

分散システム用のメッセージ レイヤーを作成しています。IOCP、つまり Socket.XXXAsync メソッドを使用しています。

これは私がやっていることにかなり近いものです (実際、私の受信機能は彼に基づいています): http://vadmyst.blogspot.com/2008/05/sample-code-for-tcp-server-using.html

私が今見つけたのは、プログラムの開始時 (2 つのテスト サーバーが互いに通信している場合) に、.Buffer が完全にゼロで埋められている SAEA オブジェクトを毎回取得することですが、.BytesTransferred のサイズはバッファ(私の場合は1024)。

これは何を意味するのでしょうか?チェックする必要がある特別な条件はありますか? 私のシステムはこれを不完全なメッセージと解釈して先に進みますが、実際にデータが欠落しているのではないかと考えています。何も受信されていない場合は、コールバックが得られないという印象を受けました。いずれにせよ、WireShark を見ると、ゼロ長のパケットが入ってくることはありません。

Google で検索したときに次の情報を見つけましたが、問題が同じかどうかはわかりません: http://social.msdn.microsoft.com/Forums/en-US/ncl/thread/40fe397c-b1da-428e -a355-ee5a6b0b4d2c

http://go4answers.webhost4life.com/Example/socketasynceventargs-buffer-not-ready-121918.aspx

4

1 に答える 1

0

リンクされた例で何が起こっているのかわかりません。非同期ソケットを同期的に使用しているようです。コードにコールバックなどは表示されません。同期または非同期ソケットが必要かどうかを再考する必要があるかもしれません:)。

当面の問題は、ネットワークの送受信が完了する前に関数がバッファに読み書きしようとしている可能性に起因します。async Socket に含まれているコールバック機能を使用してみてください。例えば

// This goes into your accept function, to begin receiving the data
    socketName.BeginReceive(yourbuffer, 0, yourbuffer.Length,
        SocketFlags.None, new AsyncCallback(OnRecieveData), socketName);

// In your callback function you know that the socket has finished receiving data
// This callback will fire when the receive is complete.
private void OnRecieveData(IAsyncResult input) {
    Socket inSocket = (Socket)input.AsyncState; // This is just a typecast
    inSocket.EndReceive(input);

    // Pull the data out of the socket as you already have before.
    // state.Data.Write ......
}
于 2012-07-13T05:31:33.787 に答える