我正在用 C# 编写一个程序,该程序有一个在多个客户端之间传输数据的服务器。现在每当我需要发送数据时,我发送 4 个字节的长度和长度字节的数据,每当接收端有数据可供读取时,它读取前 4 个字节作为长度并读取长度字节数作为数据。
我想知道是否会出现这样的情况,即某些字节可能会以某种方式丢失,然后我会被困在尝试读取数十亿字节的不存在的数据中,因为我读取了错误的字节作为长度。
我想过使用一个唯一的字符串,每当读取该字符串时,都会读取 4 个字节的长度,然后是某种校验和,然后是 4 个字节的随机 ID,然后是长度字节被读取。如果这些字节没有通过校验和或在其中找到唯一字符串,则丢弃该消息并发送请求以通过其 ID 重发该消息,并且将从下一次出现该消息开始接收下一条消息唯一的字符串。
这种方法是否足够好,还是我应该采用其他方法?
最佳答案
TCP 是所谓的传输层协议(protocol)。您可以阅读一本方便的入门书,了解可以为您提供哪些保证 here .
这反过来意味着您传输的所有数据都将按照发送时的相同顺序可靠地接收。如果任何东西在传输过程中丢失或损坏,TCP 将重新发送它。这一切都在幕后进行,您无需担心。它还处理流量控制。
您唯一需要做的不同寻常的事情就是处理意外断开的连接。除此之外(或者您可能已经在这样做),您所采用的方法很好,尽管传统上以所谓的网络字节顺序(即大端字节序)将这些长度字节放在线路上。我不知道您将如何在 C# 中执行此操作,但描述了支持此操作的 C 例程 here .但对于您正在做的事情,您可能不需要费心。
关于c# - 为正确的数据传输构建 TCP 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50780568/