- 一個名爲「connect」並使用「send」發送數據的非阻塞UDP套接字是否需要使用「select/epoll/kqueue」來測試它是否可寫?在這種情況下,另一端recv緩衝區已滿,「發送」可能會失敗,所以我可以使用「select」來測試它是否可寫,以便「發送」可能會返回成功? 或者這是不必要的,因爲它只是發送數據而不關心邊界的recv buff是否已滿?如果這是真的,那麼「發送」可能只會返回成功,除非另一方失敗?
- 對於UDP套接字,「send」的返回值是什麼,例如,我發送100個字節,它可能只返回-1(錯誤)或100,沒有其他值?對於TCP可以返回50 ~~~~
0
A
回答
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套接字,如果你寫的比鏈接或接收端能夠處理的速度快,就會發生這種情況。
相關問題
- 1. 發送和接收在UDP中的C
- 2. UDP套接字發送和接收
- 3. C#中的UDP套接字?
- 4. 用C#中的.net UDP套接字發送一個字節
- 5. C++發送和接收套接字
- 6. C++套接字 - 發送()和連接()
- 7. C - Sendto()中的UDP套接字發送失敗:無效參數
- 8. 發送在Linux的UDP套接字 - C語言
- 9. C#UDP套接字不接收數據,直到數據發送
- 10. UDP - 原始套接字 - C#
- 11. 發送套接字c ctrl + c行爲
- 12. 通過套接字發送int,c,C++
- 13. 通過UDP套接字手動發送給iperf? (C++)
- 14. C++發送數據到多個UDP套接字
- 15. 通過UDP套接字C++發送結構
- 16. 通過UDP發送一個結構C中的UNIX套接字C
- 17. 編寫C#相當於perl代碼通過UDP套接字發送和接收?
- 18. C++ UDP客戶端/套接字編程:無法發送和接收
- 19. 在C#中的套接字發送和接收(while循環)
- 20. 如何發送和接收數據的TCP套接字(C/C++)
- 21. C中的雙向UDP套接字
- 22. C++中的UDP套接字編程
- 23. C#發送UDP包
- 24. 發送和接收數據在UDP套接字java android
- 25. 通過UDP套接字發送數據
- 26. 通過UDP發送HEX值套接字
- 27. 接收錯誤與UDP套接字(C++)
- 28. 如何使用套接字c/C++在塊中發送文件?
- 29. 在C/C++中通過套接字發送多個消息
- 30. 在C/C++中通過TCP套接字發送十六進制
UDP是無連接的 - 發送方不知道數據包是否已將數據包發送給接收方,更不用說他們是否接受數據包或緩衝區是否已滿。 –