2010-10-14 71 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)。