我想知道我们何时从没有 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 字节。你怎么做到这一点?
虽然插座是open,没有办法做到这一点而不导致它在到达末尾时阻塞(期望更多数据)。
有几种方法可以做到这一点:
- 发送后关闭套接字
- 有一些表示“消息结束”的标记(使用编码文本就足够简单了 -
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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)