C# 我们如何找到所有字节都从套接字接收?

C# 我们如何找到所有字节都从套接字接收?,c#,sockets,disconnect,C#,Sockets,Disconnect,我想知道我们何时从没有套接字的套接字接收所有字节 方法 然而,我使用这段代码来接收所有字节,但是当Scoket.Send(byte[])方法完成时,我使用Socket.Disconnect()方法 List<byte> LBytes = new List<byte>(); do { System.Threading.Thread.Sleep(50); BytesRead = obj_socket.Receive(obj_buffer, 0); LBytes.Append(

我想知道我们何时从没有套接字的套接字接收所有字节 方法

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

List<byte> LBytes = new List<byte>();
do
{
System.Threading.Thread.Sleep(50);
BytesRead = obj_socket.Receive(obj_buffer, 0);
LBytes.Append(obj_buffer);
} while (BytesRead != 0);
List LBytes=new List();
做
{
系统.线程.线程.睡眠(50);
BytesRead=obj_socket.Receive(obj_缓冲区,0);
LBytes.Append(obj_缓冲区);
}while(BytesRead!=0);
因为当我们断开套接字时,套接字读取0字节。 例如,我们发送了100000字节,我们应该接收100000字节。如何执行此操作?

当套接字打开时,如果不在到达末尾时导致其阻塞(需要更多数据),则无法执行此操作

有几种方法可以做到这一点:

  • 发送后关闭套接字
  • 有一些表示“消息结束”的标记(对于编码文本来说很简单-
    0
    是一个常见的选择;但是在发送任意二进制数据时很棘手)
  • 在数据之前发送一个长度前缀(在本例中为100000),并在收到足够长度前缀时停止读取
如果它是
网络流
,例如,使用长度前缀:

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;
}

有关更多信息,请参阅您的通信协议常见问题解答。谁知道结束消息字节是什么?