2012-03-27 6 views
0

私は典型的な状況です。私はtcp経由でサーバに "要求"を送り、応答を受け取る必要があります。tcp:なぜSocket.Receive(byte [])の2番目の呼び出しだけがデータを返しますか?

// socket is connected 
socket.Send(CreateRequest()); 
byte[] br = new byte[VERY_BIG_BUFFER]; 
int count = socket.Receive(br); // only 4 bytes received: 15 0 0 0 
count = socket.Receive(br);  // here I receive data I actually need 

しかし、何らかの理由で私はすべての作品にするために二回socket.Receiveを呼び出す必要があります。 余分なコールで私はちょうど4バイトを受け取る:15 0 0 0

私はそれが必要な理由を理解せずに1つの余分なコールをハードコーディングすると、奇妙な問題が発生する可能性があります。誰かが何が起こっているのかわかっているのですか?

答えて

2

TCPはストリームベースのプロトコルです。メッセージの概念はありません。それはちょうど一連のバイトです。

は、これは、複数のreceive呼び出しに1つのsendコールを分割することができ、かつ1つのreceive呼び出し、またはそれらの組み合わせに複数のsendのコールを結合できることを意味します。

何らかの理由でメッセージを区切る必要があります。バイナリプロトコルでは長さの接頭辞が一般的です。

+0

私は最初に受信します。私は15バイトを受け取るべきであることを受け取ります。 2番目の受信では、これらの15バイトを受信します。しかし、どうすればいいですか?ちょうど落ちる最初の受信は良い権利ではない?最初の4バイトからデータを受け取るまで、ループ内のデータを受け取るべきですか? – javapowered

+0

別の質問 - もしtcpがバイト列であれば、なぜ最初の 'socket.Receive'が4バイト後に閉じられるのですか?なぜ2番目の' socket.Receive'を呼び出すために再接続する必要がないのですか? – javapowered

+0

"最初の4バイトからのデータ量は "はい、それは行く方法です。 | TCPの 'receive'では、それが気になるたびに、要求されるよりも少ないバイト数を返すことができます。たとえば、多くのバイトがすでに到着しており、残りのバイトがまだ転送されているためです。その後、もう一度それを呼び出してより多くを受け取ることができます。 「受信」は「0」を返し、ストリームの終わりを示す。 – CodesInChaos

関連する問題