阻塞式Socket VS 非阻塞式Socket

2021-06-03 11:32:20 字數 952 閱讀 2483

主要有三種型別的socket,永久阻塞模式、阻塞加超時模式和非阻塞式。socket模式可以通過apr_socket_opt_set()和apr_socket_timeout_set()這兩個api控制。

在windows和unix系統上預設的socket是永久阻塞模式

apr_so_nonblock

timeout value to apr_socket_timeout_set()

mode

off(==0)

t == 0

blocking-forever

off(==0)

t < 0

blocking-forever

off(==0)

t > 0

blocking-with-timeout

on(==1)

t == 0

non-blocking

on(==1)

t < 0

non-blocking

on(==1)

t > 0

non-blocking 

【a】    當你需要你乙個非阻塞式socket時,需要設定'apr_so_nonblock==1(on) 且 timeout==0'。

【b】    當你需要乙個阻塞加超時模式的socket時,需要設定apr_so_nonblock==0(off) 且 timeout>0。注意你必須保證呼叫api的順序,你必須先呼叫apr_socket_opt_set(sock, apr_so_nonblock, 1),然後在呼叫apr_socket_timeout_set(sock, timeout),否則在unix下這個socket會變成永久阻塞模式。

【c】    當你需要乙個永久阻塞式的socket時,需要設定apr_so_nonblock==0(off)且 timeout<0。在我看來在實際的應用程式中我們很少需要永久阻塞式socket。

阻塞式 非阻塞式IO

知識點 非阻塞式io 的兩種設定方法 1 函式fcntl 設定 o nonblock 選項 int flag fcntl sockfd,f getfl,0 檢查檔案標誌位 fcntl sockfd,f setfl,flag o nonblock 設定檔案標誌位 2 函式ioctl 設定fionbio...

非阻塞式socket

返回錯誤ewouldblock或eagain。套接字的預設狀態是阻塞的。這就意味著當發出乙個不能立即完成的套接字呼叫時,其進 程將被投入睡眠,等待相應操作完成。可能阻塞的套接字呼叫可分為以下四類 1 輸入操作,包括read readv recv recvfrom和 recvmsg共5個函式。如果某個...

嵌入式linux 阻塞與非阻塞驅動

編寫了乙個虛擬的驅動,實現的功能是在讀裝置時阻塞,直到有資料寫入裝置,然後才能讀出寫入的資料。其中有訊號量的操作與阻塞非阻塞io的操作,最後寫了乙個應用程式進行驗證 驅動如下 include include include include include include include includ...