【问题标题】:Sendto- forcing sending a UDP datagram of X bytes发送强制发送 X 字节的 UDP 数据报
【发布时间】:2019-08-17 05:19:26
【问题描述】:

我有一个关于 sendto 的基本问题:

假设我们希望目的地将接收正好 X 字节的 UDP 数据包。这意味着,它不能接收小于 X 字节的数据包(如果 sendto 返回的数据小于 X 字节,这是可能的)。是否可以强制发送方准确发送 X 个字节,或者如果不可能,甚至返回错误? (即,接收方要么会得到 X 字节的数据包,要么不会得到数据包)。

编辑: 如果发送的字节数总是 X,那么为什么返回值(发送的字节数)可能小于发送数据的字节数(如在 https://docs.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-sendto ) 并且是非负数?

【问题讨论】:

    标签: sockets udp


    【解决方案1】:

    也就是说,它无法接收小于 X 字节的数据包(如果 sendto 返回小于 X 字节,则有可能)。

    这绝不会发生在 UDP 套接字上。来自the send(2) manual page

    如果消息太长,无法通过底层协议原子传递,则返回错误EMSGSIZE,消息不传输。

    简而言之,您要求的行为默认情况下已经存在。

    【讨论】:

    • 如果不是这种情况,UDP 将无法使用。考虑到数据报可以被丢弃、复制或重新排序,如果实现可以以这种方式拆分数据,那么使用 UDP 几乎是不可能的。
    • 但是实际发送的字节数可能小于发送缓冲区的字节数。如docs.microsoft.com/en-us/windows/win32/api/winsock/…
    • @user3563894 不在 UDP 套接字的上下文中。请记住,sendto() 可以在任何套接字上使用;它可以为其他类型的套接字返回部分写入。
    • 谢谢 :) 这正是我需要听到的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多