UDP Socket.SendTo是否可以执行不完整的发送?

时间:2015-01-03 21:08:49

标签: c# sockets udp

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

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


这个古老的问题已经过彻底检查,以便对未来的搜索者更有帮助。

1 个答案:

答案 0 :(得分:0)

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

在UDP进行处理之后,我们为底层协议设置了两个分支:

  • <强> IPV4

    IP协议保证到达的数据包没有错误,即&#34;整个&#34; (source):

      

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

    UDP(IP,Link等)下面的协议层可能会分割数据(fragmentation),但是它们会保证当它发送到UDP层时数据包是与在发件人上进入协议层的那个相同。

  • <强> IPV6

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

因此,保证数据报被整体发送,并且(如果它们被接收)没有错误。这可以通过this comparison between UDP and TCP

中的以下内容进行总结
  

数据包具有明确的边界,这些边界在接收时受到尊重,这意味着接收器插槽上的读取操作将产生最初发送的整个消息。