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つの余分なコールをハードコーディングすると、奇妙な問題が発生する可能性があります。誰かが何が起こっているのかわかっているのですか?
私は最初に受信します。私は15バイトを受け取るべきであることを受け取ります。 2番目の受信では、これらの15バイトを受信します。しかし、どうすればいいですか?ちょうど落ちる最初の受信は良い権利ではない?最初の4バイトからデータを受け取るまで、ループ内のデータを受け取るべきですか? – javapowered
別の質問 - もしtcpがバイト列であれば、なぜ最初の 'socket.Receive'が4バイト後に閉じられるのですか?なぜ2番目の' socket.Receive'を呼び出すために再接続する必要がないのですか? – javapowered
"最初の4バイトからのデータ量は "はい、それは行く方法です。 | TCPの 'receive'では、それが気になるたびに、要求されるよりも少ないバイト数を返すことができます。たとえば、多くのバイトがすでに到着しており、残りのバイトがまだ転送されているためです。その後、もう一度それを呼び出してより多くを受け取ることができます。 「受信」は「0」を返し、ストリームの終わりを示す。 – CodesInChaos