【问题标题】:Dealing with sendto failure for UDP socket处理 UDP 套接字的 sendto 失败
【发布时间】:2011-04-25 07:10:15
【问题描述】:

如果根据手册页 sendto 失败

“成功时,这些调用返回发送的字符数。出错时,返回-1,并适当设置errno。”

我知道 TCP 肯定是这种情况,您应该真正尝试发送剩余的数据,如 Beej 的网络编程指南中指出的那样。

但是,部分发送 UDP 数据包对我来说毫无意义,而这条评论似乎暗示了这一点。

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

有人可以为我确认,如果我使用 UDP 数据包调用 sendto(或发送),如果它实际上不适合出站缓冲区,那么我将返回 -1,并将 errno 设置为 EMSGSIZE 并且没有部分发送与流 (TCP) 套接字一样吗?

【问题讨论】:

    标签: udp


    【解决方案1】:

    EMSGSIZE 表示“套接字要求以原子方式发送消息,但是要发送的消息的大小使这不可能”(参见man sendto)。

    但是,出站缓冲区已满不一定是原因 - Linux(例如)默认情况下显然不会对 UDP 数据包进行分段(请参阅man udp)。

    【讨论】:

      【解决方案2】:

      没有隐藏的含义,该函数只是返回发送的字节数。它是 Unix API 的标准模式。数据报是全有或全无交付,如果网络导致发生碎片,则接收会更加复杂,但通常堆栈会隐藏所有细节并在重建时呈现每个完整的数据包。

      【讨论】:

        猜你喜欢
        • 2016-01-07
        • 2015-07-27
        • 2011-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多