網路程式設計中阻塞和非阻塞socket的區別

時間 2022-04-11 21:05:24

1樓:七彩虹科技****

阻塞阻塞呼叫是指呼叫結果返回之前,當前執行緒會被掛起。函式只有在得到結果之後才會返回。有人也許會把阻塞呼叫和同步呼叫等同起來,實際上他是不同的。

對於同步呼叫來說,很多時候當前執行緒還是啟用的,只是從邏輯上當前函式沒有返回而已。例如,我們在csocket中呼叫receive函式,如果緩衝區中沒有資料,這個函式就會一直等待,直到有資料才返回。而此時,當前執行緒還會繼續處理各種各樣的訊息。

如果主視窗和呼叫函式在同一個執行緒中,除非你在特殊的介面操作函式中呼叫,其實主介面還是應該可以重新整理。socket接收資料的另外一個函式recv則是一個阻塞呼叫的例子。當socket工作在阻塞模式的時候,如果沒有資料的情況下呼叫該函式,則當前執行緒就會被掛起,直到有資料為止。

非阻塞非阻塞和阻塞的概念相對應,指在不能立刻得到結果之前,該函式不會阻塞當前執行緒,而會立刻返回。

物件的阻塞模式和阻塞函式呼叫

物件是否處於阻塞模式和函式是不是阻塞呼叫有很強的相關性,但是並不是一一對應的。阻塞物件上可以有非阻塞的呼叫方式,我們可以通過一定的api去輪詢狀態,在適當的時候呼叫阻塞函式,就可以避免阻塞。而對於非阻塞物件,呼叫特殊的函式也可以進入阻塞呼叫。

函式select就是這樣的一個例子。

2樓:地瓜說機

阻塞:一般的i/o操作可以在新建的流中運用.在伺服器迴應前它等待客戶端傳送一個空白的行.

當會話結束時,伺服器關閉流和客戶端socket.如果在佇列中沒有請示將會出現什麼情況呢?那個方法將會等待一個的到來.

這個行為叫阻塞.accept()方法將會阻塞伺服器執行緒直到一個呼叫到來.當5個連線處理完閉之後,伺服器退出.

任何的在佇列中的呼叫將會被取消.

非阻塞:非阻塞套接字是指執行此套接字的網路呼叫時,不管是否執行成功,都立即返回。比如呼叫recv()函式讀取網路緩衝區中資料,不管是否讀到資料都立即返回,而不會一直掛在此函式呼叫上。

在實際windows網路通訊軟體開發中,非同步非阻塞套接字是用的最多的。平常所說的c/s(客戶端/伺服器)結構的軟體就是非同步非阻塞模式的

linux網路程式設計中阻塞和非阻塞socket的區別

3樓:匿名使用者

對於阻塞的socket,當socket的接收緩衝區中沒有資料時,read呼叫會一直阻塞住,直到有資料到來才返

回。當socket緩衝區中的資料量小於期望讀取的資料量時,返回實際讀取的位元組數。當sockt的接收緩衝

區中的資料大於期望讀取的位元組數時,讀取期望讀取的位元組數,返回實際讀取的長度。

對於非阻塞socket而言,socket的接收緩衝區中有沒有資料,read呼叫都會立刻返回。接收緩衝區中有

資料時,與阻塞socket有資料的情況是一樣的,如果接收緩衝區中沒有資料,則返回錯誤號為

ewouldblock,

表示該操作本來應該阻塞的,但是由於本socket為非阻塞的socket,因此立刻返回,遇到這樣的情況,可

以在下次接著去嘗試讀取。如果返回值是其它負值,則表明讀取錯誤。

因此,非阻塞的rea呼叫一般這樣寫:

if ((nread = read(sock_fd, buffer, len)) < 0)

else return -1; //表示讀取失敗

}else return nread;讀到資料長度

linux網路程式設計中阻塞和非阻塞socket的區別

4樓:匿名使用者

阻塞阻塞呼叫是指呼叫結果返回之前,當前執行緒會被掛起(執行緒進入非可執行狀態,在這個狀態下,cpu不會給執行緒分配時間片,即執行緒暫停執行)。函式只有在得到結果之後才會返回。

非阻塞非阻塞和阻塞的概念相對應,指在不能立刻得到結果之前,該函式不會阻塞當前執行緒,而會立刻返回。

linux網路程式設計中阻塞和非阻塞socket的區別

5樓:風兒吹來童年畫

阻塞的情況下,如果讀socket,而socket沒有資料,則程式就在socket等資料,一直不返回(除非socket錯誤或者超時) 非阻塞的情況下,如果讀socket,而socket沒有資料,則返回來,表示讀了0個位元組回來。 當socket有資料時,阻塞與非阻塞是一樣的

linux網路程式設計中阻塞和非阻塞socket的區別

6樓:福建黃律師

您好,很高興為您解答。 讀操作對於阻塞的socket,當socket的接收緩衝區中沒有資料時,read呼叫會一直阻塞住,直到有資料到來才返回。當socket緩衝區中的資料量小於期望讀取的資料量時,返回實際讀取的位元組數。

當sockt的接收緩衝區中的資料大於期...

非阻塞IO為什麼能降低執行緒數量?

首先非阻塞 原理還是在其他執行緒中去執行功能,而不是在呼叫此功能的執行緒中去執行,呼叫執行緒在呼叫後可以立即返 用處繼續往下執行,所以不會阻塞,但是原本一個執行緒做的事情,現在讓幾個執行緒去做了,執行緒數量肯定增加了,但是此程序,這裡是程序,可使用的執行緒數 是減少的,是可使用。簡單說,就是提高io...

阻塞性肺氣腫是生活中很常見的疾病,如何治療這種疾病

什麼是阻塞性肺氣腫阻塞性肺氣腫這種疾病,相信很多人都是聽說過,它是一種比較嚴重的肺部病變,對肺部的健康危害極大。阻塞性肺氣腫是指終末細支氣管遠端的氣道彈性減退,過度膨脹,充氣和肺容積增大,或同時伴有氣道壁破壞的一種疾病,多數是由於長期吸菸,大氣汙染。吸入有害化學物質和粉塵以及慢性反覆呼吸道感染等誘發...

網路和程式設計,哪個更發展前景更好

網路 入門容易進階難 程式 入門一般進階相對簡單 前者 前期更看重經驗,後期理論經驗一個都不能少。而且要懂程式設計。無論是硬體還是軟體都一樣。而且要了解大裝置,要懂資料庫等等.綜合知識很多。而且,一直追新裝置新技術很累。各種協議要深入瞭解。各大系統都要會一點。因為你解決問題的時候通常都是整體考慮,如...