1. 程式人生 > >套接字的阻塞與非阻塞

套接字的阻塞與非阻塞

套接字的預設狀態是阻塞。阻塞的套接字呼叫可分為四種

(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成功返回的情況。