我们如何才能找到从套接字接收的所有字节?
我想知道什么时候我们从没有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; }