深入理解阻塞socket和非阻塞socket

2021-08-25 11:58:42 字數 937 閱讀 6023

什麼是阻塞socket,什麼是非阻塞socket。對於這個問題,我們要先弄清什麼是阻塞/非阻塞。阻塞與非阻塞是對乙個檔案描述符指定的檔案或裝置的兩種工作方式。 阻塞的意思是指,當試圖對該檔案描述符進行讀寫時,如果當時沒有東西可讀或者暫時不可寫,程式就進入等待狀態,直到有東西可讀或者可寫為止。 非阻塞的意思是,當沒有東西可讀或者不可寫時,讀寫函式就馬上返回,而不會等待。

現在來理解什麼是阻塞socket,什麼是非阻塞socket。每個通過socket()函式建立的socket,本質就是乙個檔案描述符,所以對該檔案描述符的io操作方式不同,就有了阻塞socket和非阻塞socket。 那是不是說阻塞socket下的所以socket api函式都是阻塞的呢,如果你還不能正確的回答這個問題,說明上面簡短的說明並沒有讓你真正的明白什麼是阻塞socket和非阻塞socket。這個問題的答案是否定的,為什麼是否定的,因為並不是每個socket的api都會涉及到對檔案描述符的io操作。

這裡我列舉了,哪些socket api會阻塞:

accept,connect,recv(recvfrom),send(sendto),closesocket,select(poll或epoll)

1)accept在阻塞模式下,沒有新連線時,執行緒會進入睡眠狀態;非阻塞模式下,沒有新連線時,立即返回wouldblock錯誤。

2)connect在阻塞模式下,僅tcp連線建立成功或出錯時才返回,分幾種具體的情況,這裡不再敘述;非阻塞模式下,該函式會立即返回inprocess錯誤(需用select檢測該連線是否建立成功)

3)recv/recvfrom/send/sendto很好理解,因為這兩類函式讀寫socket檔案描述符的接收/傳送緩衝區。 

4) select/poll/epoll並不是真正意義上的阻塞,它們的阻塞是由於它們最後乙個timeout引數決定的,timeout大於0時,它們會一直等待直到超時才退出(相等於阻塞了吧,^_^),而timeout=-1即永遠等待

通過RTL電路深入理解阻塞賦值和非阻塞賦值的區別

稍微接觸過verilog hdl的都對阻塞與非阻塞賦值略知一二,也是我們經常強調的重點之一,在課堂上還是有學員問什麼不一樣呢,為什麼我用阻塞賦值也能得出正確的結果呢?在編寫可綜合 的時候,建議大家不要忘了開啟rtl網表檢視器看看我們自己綜合出來的電路是不是自己想要的邏輯。我就阻塞與非阻塞賦值這個問題...

阻塞 非阻塞socket的理解

b 阻塞socket是這樣的 b recv socket1,buf,length 去網絡卡緩衝區讀取socket1的資料,讀到的資料儲存到buf 如果網絡卡緩衝區有1個位元組,就返回1個,有兩個就返回兩個,當然不能超過length 如果網絡卡緩衝區沒有資料,那麼就一直等待,直到有資料可讀 是的,很傻...

轉阻塞socket和非阻塞socket

讀操作 對於阻塞的socket,當socket的接收緩衝區中沒有資料時,read呼叫會一直阻塞住,直到有資料到來才返 回。當socket緩衝區中的資料量小於期望讀取的資料量時,返回實際讀取的位元組數。當sockt的接收緩衝 區中的資料大於期望讀取的位元組數時,讀取期望讀取的位元組數,返回實際讀取的長...