套接字的阻塞與非阻塞
阿新 • • 發佈:2019-01-23
套接字的預設狀態是阻塞。阻塞的套接字呼叫可分為四種
(1),輸入操作,包括read,readv,recv,recvfrom,recvmsg。
阻塞:
TCP:如果接收緩衝區沒有資料讀,則阻塞,直到資料到達。
UDP:如果接收緩衝區沒有資料讀,則阻塞,直到UDP資料報到達。
非阻塞:如果輸入操作不能被滿足(對於TCP套接字即至少有一個位元組的資料可讀,對於UDP套接字即有一個完整的資料報可讀),相應呼叫將立即返回EWOULDBLOCK。
(2),輸出操作,包括write,writev,send,sendto,sendmsg
阻塞:
TCP:如果傳送緩衝區沒有空間,則阻塞。有一些空間時,則返回不足計數
非阻塞:TCP:如果傳送緩衝區沒有空間,會立即返回一個EWOULDBLOCK錯誤。如
果有一些空間,返回值將是核心能夠複製到該緩衝區中的位元組數。這個
位元組數也稱為不足計數
輸出操作對於UDP:沒有傳送緩衝區,不會因與TCP套接字一樣的原因而阻塞,不過有可能會因其他原因而阻塞。
(3)接收外來連線,即用於accept函式
阻塞:阻塞在accept,直到有新的連線
非阻塞:沒有新的連線來時,accept呼叫將立即返回一個EWOULDBLOCK
(4),發起外出連線,即用於TCP的connect函式。
阻塞:connect函式一直要等到客戶收到對於自己的SYN的ACK為止才返回。所以TCP的每一個connect總會阻塞其呼叫的程序至少一個到伺服器的RTT時間。
非阻塞:呼叫connect,並連線不能立即建立,那麼連線的建立能照樣發起,不過會返回一個EINPROGRESS錯誤。這個錯誤不同於上述三個情形,但客戶端和服務端在同一主機,這些連線會立即建立。所以也要預備connect成功返回的情況。