2012-05-31 8 views
6

私は自分の分散システム用のメッセージレイヤーを作成しています。私はIOCP、すなわちSocket.XXXAsyncメソッドを使用しています。私が今見つけた何 http://vadmyst.blogspot.com/2008/05/sample-code-for-tcp-server-using.htmlSocketAsyncEventArgsバッファがゼロでいっぱいです

は、そのプログラムの先頭である(2:ここでは

は私がやっているものにかなり近いもの(実際には、私の受信機能が、彼に基づいています)ですテストサーバ同士の会話)私は毎回.Bufferが0で満たされたSAEAオブジェクトをいくつも取得しますが、.BytesTransferredはバッファのサイズ(私の場合は1024)です。

これはどういう意味ですか?私が確認する必要がある特別な条件はありますか?私のシステムは、これを不完全なメッセージと解釈して動いていますが、私は実際にいくつかのデータが欠落しているのだろうかと思います。私は何も受け取られなければコールバックを得られないという印象を受けました。いずれにしても、WireSharkには、長さ0のパケットが入っていないことがわかります。

私はグーグルで次のものを見つけましたが、私の問題が同じかどうかはわかりません: 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

+0

データの損失によるデータ処理エラーはありませんでしたので、何も失われていないと思います。しかし、それはなぜ方法が何度も何度も戻ってこない理由の問題を残しています。 – Carlos

+1

簡単な説明なしで(コード付きで)必要なソリューションを提供することは難しいです。しかし、私はソケットでの経験があり、より抽象度の高いネットワークストリームを使用することをお勧めします。ネットワークストリームには、使用する非同期コールバックのすべての機能があります。 http://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream.aspxおよびhttp://msdn.microsoft.com/en-us/library/system.net.socketsを参照してください。 networkstream.beginwrite.aspx HTH –

+0

同じ基本コールですか?それは役に立つと思われる。また、私が参照しているコードはリンクにあります。 – Carlos

答えて

0

私がリンクされている例で起こっているではないものを確信しています。同期的な方法で非同期ソケットを使用しているようです。私はコード内でコールバックやそれに類するものを見ることができません。同期ソケットまたは非同期ソケットが必要かどうか再考する必要があるかもしれません:)。

この問題は、ネットワークの送受信が完了する前に、バッファに読み書きしようとしている可能性があります。非同期ソケットに含まれるコールバック機能を使用してみてください。例えば。

// 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 ...... 
} 
+0

コールバックは、SAEAオブジェクトのイベントハンドラです。私は実際にいくつかの最小の文法上のエラーでコードを実行しました。 – Carlos

+0

ペーストビンなどにレシーバコードを貼り付けることは可能ですか?私は自分のベースとしている例だけを見てきました。 – themartinmcfly

関連する問題