我在理解recv()/ recvfrom()從非阻塞UDP套接字返回時遇到問題。在C中的非阻塞udp套接字編程:我得到什麼?
更具體一點,並與TCP(請糾正我,如果我錯了):直到
阻塞套接字(TCP或UDP)將不會從一個recv的返回()有是緩衝區中的一些數據。這可能是一些字節數(TCP)或完整的數據報(UDP)。
一個非阻塞的TCP套接字或者返回EWOULDBLOCK(linux)/ WSAEWOULDBLOCK(windows)或者當前在緩衝區中的字節。由於TCP數據是一個流,返回多少字節並不重要。
現在的問題:
- 非阻塞UDP套接字也返回WOULDBLOCK(Linux)的/ WSAEWOULDBLOCK(窗口),如果沒有可用數據。但是,如果有數據可用,那麼非阻塞UDP套接字是否只返回一些字節,這可能意味着您只能獲得數據報的一半或者UDP套接字始終返回完整的數據報?
編輯:
我指的是「一個數據包的一半」的是:會發生什麼,如果我可以調用recv()在短短的時刻插座當前正在接收數據報。在那一刻,緩衝區中有一些字節,但數據報尚未完成。
您的解釋和意見,讚賞。謝謝!
它看起來像是可以在Linux中傳遞和接收MSG_TRUNC標誌到'recvmsg'。在手冊頁recv(2)中記錄。另一方面,也許我誤讀了,但是我只能找到'socket(2)'的manpage中記錄的丟棄行爲,它只爲'SOCK_SEQPACKET'套接字提及。我從來沒有親自使用過這些。 – 2010-02-11 09:10:58
'MSG_TRUNC'作爲'recv(2)'的參數不是標準的。它在FreeBSD或Mac OS X上都不可用(我目前可以訪問的系統,其他人可能也適用)。 'MSG_TRUNC'可以在'struct msghdr'的'flags'成員的Linux,FreeBSD和Mac OS X上傳遞給'recvmsg(2)'。在任何情況下,即使使用Linux上的'recv(2)',如果傳遞的緩衝區不夠大,數據報將被截斷。如果在那裏使用MSG_TRUNC,調用者必須檢查返回值並將其與緩衝區的大小進行比較。它會知道數據丟失,但仍然丟失。 – 2010-02-11 16:07:16
謝謝!這意味着UDP是**真的**數據包導向... – Uwe 2010-02-11 17:34:43