我们如何才能找到从套接字接收的所有字节?

我想知道什么时候我们从没有Socket.Disconnect()方法的套接字接收所有字节?

然而,我使用此代码接收所有字节,但是当Scoket.Send(byte [])方法完成时,我使用Socket.Disconnect()方法。

List LBytes = new List(); do { System.Threading.Thread.Sleep(50); BytesRead = obj_socket.Receive(obj_buffer, 0); LBytes.Append(obj_buffer); } while (BytesRead != 0); 

因为当我们断开套接字时,套接字读取0个字节。 例如,我们发送了100,000个字节,我们应该收到100,000个字节。 你是怎么做到的?

当套接字打开时 ,没有办法这样做而不会在它到达末尾时阻止它(期望更多的数据)。

有几种方法可以做到:

  • 发送后关闭套接字
  • 有一些标记,意思是“消息结束”(编码文本很容易 – 0是一个常见的选择;但是在发送任意二进制数据时很棘手)
  • 在数据之前发送一个长度前缀(在这种情况下为100,000),并在你获得那么多时停止阅读

如果它是NetworkStream ,例如,使用长度前缀:

 int expecting = //TODO: read header in your chosen form int bytesRead; while(expecting > 0 && (bytesRead = stream.Read(buffer, 0, Math.Min(expecting, buffer.Length))) > 0) { // TODO: do something with the newly buffered data expecting -= bytesRead; }