- 一個名爲「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. C#中的UDP套接字?
- 2. C++發送和接收套接字
- 3. C++套接字 - 發送()和連接()
- 4. C#UDP套接字不接收數據,直到數據發送
- 5. UDP - 原始套接字 - C#
- 6. 發送套接字c ctrl + c行爲
- 7. C++發送數據到多個UDP套接字
- 8. 通過UDP套接字C++發送結構
- 9. 通過UDP發送一個結構C中的UNIX套接字C
- 10. 編寫C#相當於perl代碼通過UDP套接字發送和接收?
- 11. 在C#中的套接字發送和接收(while循環)
- 12. C++中的UDP套接字編程
- 13. 通過UDP發送HEX值套接字
- 14. C#發送UDP包
- 15. 接收錯誤與UDP套接字(C++)
- 16. 在C/C++中通過TCP套接字發送十六進制
- 17. 在C/C++中通過套接字發送多個消息
- 18. Objective-C在iOS上發送和接收套接字
- 19. C套接字 - 發送()發送,接收()不接收
- 20. udp在C++中輪詢套接字和多播
- 21. 消息未發送:C套接字
- 22. C#用套接字發送IList
- 23. C#套接字發送錯誤
- 24. C#套接字發送圖片JPEG
- 25. C#套接字重構(數據發送)
- 26. C#套接字發送vs BeginSend性能
- 27. C:將文件發送到套接字
- 28. 跨平臺C++ UDP套接字庫
- 29. C#udpclient/UDP套接字 - 全球地址
- 30. C++多UDP套接字數據處理
UDP是無連接的 - 發送方不知道數據包是否已將數據包發送給接收方,更不用說他們是否接受數據包或緩衝區是否已滿。 –