2010-10-14 168 views
1

如果SENDTO未按照手册页使用sendto失败的UDP套接字

交易“成功时,这些调用返回发送。在错误的字符数,则返回-1,并且errno设置为合适。”

我知道,TCP确实是这种情况,您应该尝试将Beej指南中指出的其余数据发送给网络编程。

但是,部分发送一个UDP数据包对我来说没有意义,这个评论似乎暗示了它。

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

有人可以证实,如果我打电话sendto(或发送)与UDP数据包,如果它实际上不适合出站缓冲区,然后我会-1返回与errno设置为EMSGSIZE和没有部分与流(TCP)套接字一起发送?

回答

3

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

1

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

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