c# - 为正确的数据传输构建 TCP 消息

标签 c# networking tcp

我正在用 C# 编写一个程序,该程序有一个在多个客户端之间传输数据的服务器。现在每当我需要发送数据时,我发送 4 个字节的长度和长度字节的数据,每当接收端有数据可供读取时,它读取前 4 个字节作为长度并读取长度字节数作为数据。

我想知道是否会出现这样的情况,即某些字节可能会以某种方式丢失,然后我会被困在尝试读取数十亿字节的不存在的数据中,因为我读取了错误的字节作为长度。

我想过使用一个唯一的字符串,每当读取该字符串时,都会读取 4 个字节的长度,然后是某种校验和,然后是 4 个字节的随机 ID,然后是长度字节被读取。如果这些字节没有通过校验和或在其中找到唯一字符串,则丢弃该消息并发送请求以通过其 ID 重发该消息,并且将从下一次出现该消息开始接收下一条消息唯一的字符串。

这种方法是否足够好,还是我应该采用其他方法?

最佳答案

TCP 是所谓的传输层协议(protocol)。您可以阅读一本方便的入门书,了解可以为您提供哪些保证 here .

这反过来意味着您传输的所有数据都将按照发送时的相同顺序可靠地接收。如果任何东西在传输过程中丢失或损坏,TCP 将重新发送它。这一切都在幕后进行,您无需担心。它还处理流量控制。

您唯一需要做的不同寻常的事情就是处理意外断开的连接。除此之外(或者您可能已经在这样做),您所采用的方法很好,尽管传统上以所谓的网络字节顺序(即大端字节序)将这些长度字节放在线路上。我不知道您将如何在 C# 中执行此操作,但描述了支持此操作的 C 例程 here .但对于您正在做的事情,您可能不需要费心。

关于c# - 为正确的数据传输构建 TCP 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50780568/

相关文章:

python - 如何在 python 中使用 tcp 套接字发送 json 对象

java - 从在 docker 容器中运行的 elasticsearch 客户端连接 elasticsearch 集群(即非 dockerized)

c - 使用TCP从服务器下载文件

C# - 捕获网络流量

C# 检查互联网连接

linux - 无法在 Perl 中设置 TCP_NODELAY - 关于权限的错误 - 为什么? (但我可以在 python 和 ruby​​ 中设置)

javascript - 如何自动将用户信息传递到 Bot Framework 对话实例,而不将其作为显式消息发布在聊天窗口中?

c# - 使用 Thinktecture.IdentityModel lib 使用 UseBasicAuthentication 与 Webapi 和 OWIN 我的 Controller 中的身份没有声明

c# - 为什么可以通过ref参数修改readonly字段?

c# - 了解 Trace 在 C# 中的工作原理