2017-04-11 42 views
0
  1. 一個名爲「connect」並使用「send」發送數據的非阻塞UDP套接字是否需要使用「select/epoll/kqueue」來測試它是否可寫?在這種情況下,另一端recv緩衝區已滿,「發送」可能會失敗,所以我可以使用「select」來測試它是否可寫,以便「發送」可能會返回成功? 或者這是不必要的,因爲它只是發送數據而不關心邊界的recv buff是否已滿?如果這是真的,那麼「發送」可能只會返回成功,除非另一方失敗?
  2. 對於UDP套接字,「send」的返回值是什麼,例如,我發送100個字節,它可能只返回-1(錯誤)或100,沒有其他值?對於TCP可以返回50 ~~~~
+0

UDP是無連接的 - 發送方不知道數據包是否已將數據包發送給接收方,更不用說他們是否接受數據包或緩衝區是否已滿。 –

回答

1

在這種情況下,對方的recv緩衝區已滿,「發送」可能會失敗,所以我 可以用「選擇」,以測試它的可寫,這樣「發送」可能會返回 成功?

您正在使用UDP。數據包被髮送,如果接收端的接收緩衝區已滿,接收系統將丟棄它。閱讀:https://en.wikipedia.org/wiki/User_Datagram_Protocol#Reliability_and_congestion_control_solutions

send()調用的結果將完全獨立於接收器的狀態。即使接收方不存在,它也會返回成功。

看到這個對於UDP如何處理數據包比底層網絡的數據包大小:UDP Sockets on Linux; send successfully but unable to receive large buffer

0

一般來說,send()不會阻止,並始終返回寫入的字節數,除非在本地(發送)緩衝內核已滿。對於基本上不會發生的UDP套接字。對於一個TCP套接字,如果你寫的比鏈接或接收端能夠處理的速度快,就會發生這種情況。