主要有三種型別的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...