1

我想知道我们何时从没有 Socket.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(obj_buffer);
} while (BytesRead != 0);

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

4

1 回答 1

3

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

有几种方法可以做到:

  • 发送后关闭套接字
  • 有一些表示“消息结束”的标记(使用编码文本很容易——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;
}
于 2011-02-21T11:03:20.107 回答