处理UDP套接字的sendto失败

时间:2010-10-14 08:54:30

标签: udp

如果sendto根据联机帮助页失败

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

我知道TCP绝对是这种情况,你应该真正尝试发送Beej网络编程指南中指出的剩余数据。

然而,部分发送UDP数据包对我来说没有意义,这个评论似乎意味着它。

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

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

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