gpt4 book ai didi

c# - 当 TCP 没有在一次读取中获得所有字节时,你如何解释

转载 作者:可可西里 更新时间:2023-11-01 02:31:34 24 4
gpt4 key购买 nike

我刚读了一篇文章,说 TCPClient.Read() 可能无法在一次读取中获取所有发送的字节。你如何解释这一点?

例如,服务器可以向tcp流写入一个字符串。客户端读取字符串字节的一半,然后在另一个读取调用中读取另一半。

你怎么知道什么时候需要合并在两个调用中接收到的字节数组?

最佳答案

how do you know when you need to combine the byte arrays received in both calls?

您需要在协议(protocol)级别决定这一点。常见的模型有四种:

  • Close-on-finish:每个连接的每一方只能发送一个“消息”。发送消息后,他们关闭套接字的发送端。接收端不断读取,直到到达流的末尾。
  • 长度前缀:在每条消息之前,包括消息中的字节数。这可以是固定长度格式(例如总是 4 个字节)或某种压缩格式(例如每个字节 7 位大小数据,最高位设置为大小数据的最后一个字节)。然后是消息本身。接收代码将读取大小,然后读取那么多字节。
  • 分 block :类似于长度前缀,但分 block 较小。每个 block 都有长度前缀,最后一个 block 表示“消息结束”
  • 消息结束信号:继续阅读,直到看到消息的终止符。如果消息必须能够包含任意数据,这可能会很痛苦,因为您需要包含转义机制才能在消息中表示终止符数据。

此外,不太常见的是,有些协议(protocol)中每条消息总是特定的大小 - 在这种情况下,您只需要继续前进,直到您读取了那么多数据。

在所有这些情况下,您基本上都需要循环,将数据读入某种缓冲区,直到您拥有足够的数据为止,无论您如何确定。你应该总是使用Read的返回值来记录你实际读取了多少字节,并且总是检查它是否为0,在这种情况下你已到达流的末尾。

另请注意,这不仅会影响网络流 - 除了本地 MemoryStream 之外的任何其他内容(如果它在流中,它将始终一次性读取您请求的数据完全没有),您应该假设数据可能仅在多次调用过程中可用。

关于c# - 当 TCP 没有在一次读取中获得所有字节时,你如何解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12595457/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com