tcp:为什么只有第二次调用Socket.Receive(byte [])才能返回数据?

时间:2012-03-27 18:10:10

标签: .net sockets tcp

我有典型的情况。我需要通过tcp向服务器发送“请求”并接收响应。

// 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才能使一切正常。 在额外的通话中,我只收到四个字节:15 0 0 0。

硬编码一个额外的电话而不理解为什么我需要它可能会导致奇怪的问题。有人知道发生了什么,为什么我需要额外的电话?

1 个答案:

答案 0 :(得分:2)

TCP是基于流的协议。它没有消息的概念。它只是一个字节序列。

这意味着它可以将一个send来电分成多个receive来电,并且可以将多个send来电合并为一个receive来电或其组合。< / p>

您需要以某种方式划分邮件。长度前缀是二进制协议的流行选择。