【问题标题】:Is it possible for UDP Socket.SendTo to perform an incomplete send?UDP Socket.SendTo 是否可以执行不完整的发送?
【发布时间】:2017-12-31 18:15:56
【问题描述】:

Socket.SendTo 的返回值是一个int,表示实际从缓冲区发送的字节数。这是否意味着可以发送部分数据报,其中仅包含请求发送的部分数据?

如果是这样,程序员在收到数据报时是否需要做任何工作来重组数据报,或者是否透明地处理?


为了清晰起见,对这个旧问题进行了彻底检查,以便对未来的搜索者更有帮助。

【问题讨论】:

  • '假设所有数据都没有发送' - 好吧,你检查了吗?您不能发送少于整个数据报的任何内容(没有数据报除外)。但是,如果不够大,您可以将不到整个数据报复制到您的 rx 缓冲区中。
  • 如果 SendTo 没有返回错误,则应该发送整个数据报。如果它确实返回错误,则不会发送任何内容。不存在发送部分数据报的问题——它不会发生。如果您在 UDP 之上有一些安全协议可以识别对等方丢失的数据报并通知遗漏,那么您将始终必须重新发送整个数据报。
  • @MartinJames 你能提供一些参考吗?我是套接字编程的新手。我也被告知。谢谢

标签: c# sockets udp


【解决方案1】:

UDP 是一种面向消息的协议,因此发送完整数据报而不是部分数据报的是guaranteed。然而,数据报可能太长而无法发送,这是至少在 Linux 和 Windows 上暴露给程序员的错误。

在 UDP 处理之后,我们就有了底层协议的两个分支:

  • IPV4

    IP 协议保证到达的数据包没有错误,即“完整”(source):

    IPv4 提供保护措施以确保 IP 数据包标头没有错误。路由节点计算数据包的校验和。如果校验和错误,路由节点将丢弃该数据包。

    UDP 之下的协议层(IP、链路等)可能会拆分数据(fragmentation),但它们会保证当它交给 UDP 层时,数据包与进入其协议的数据包相同发送者上的层。

  • IPV6

    IP 协议不再保证数据包无误地到达,但在 IPv6 上使用的 UDP 伪标头包括 checksum information,因此 IP 层不保证这一点,而是 UDP 层。

因此,数据报保证被完整发送,并且(如果它们被接收)是无错误的。这是this comparison between UDP and TCP的以下总结:

数据包有明确的边界,在接收时遵守,这意味着接收方套接字上的读取操作将产生一个完整的消息,就像它最初发送的那样。

【讨论】:

  • 我喜欢这个问题,但我没有在答案中看到任何强有力的证据..
猜你喜欢
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多