阻塞socket與非阻塞的socket(轉載)

我來回答一下這個問題。。。
首先在創建socket,,然後綁定什麼就不說了,,,然後listen 監聽前面創建的socket(你可以把listen當然是後臺運行的監控一樣)

listen語句之後一般會有accept。這個是接受連接請求的。
當監聽到有連接請求來的時候,,,accept就會 重新創建一個socket(注意,該socket纔是真正用來通信的)。。。。。。。

到這裏樓主可明白了。。。。前面自己創建的socket只是用來listen(監聽)的。。只有當監聽到有連接請求時,並且accept函數接受了連接,纔會創建一個新的socket。。這個新建的是用來通信的(明白)


那阻塞與非阻塞是什麼情況呢? 這個只是針對accept來有意義。就是說,默認情況下,accept函數是阻塞的,就是說,在沒有新連接請求來的情況下(listen監聽),accept一直在這裏等,函數沒有返回,也就是說,卡在這個地方而不會創建新的socket,程序不會往下運行。。一旦有連接請求過來,則馬上答應連接,並自行創建一個新socket,accept的返回值就是socket這值。相當於文件描述符性質。。。。

  非阻塞,用戶可以設置(fcntl函數), 這種情況下,accept函數,在沒有連接請求來的情況下,馬上會返回,也就是說不會在這裏等,程序就會往下運行,返回值會一個負數。也就是說socket沒有創建成功。。。。

總的來說,用來通信的socket 是accept函數的返回值,只有真連接來的時候,accept纔會返回一個正確的值,這個返回值就是socket的描述符。

阻塞情況下,,沒有連接請求來的時候,一直卡在這裏,不會有返回值,也就沒有創建socket,直到有請求。
非阻塞情況下,不管你有沒有連接來,返正accept函數會馬上執行完,並返回一個值。。當沒有請求時,返回的是負數,也就是說這個socket是錯誤的,不可用。有請求的時候返回正數,這個就是socket描述符。

 

 

測試發現阻塞和非阻塞read都會直接返回(好像和書上講的不是很一致),好像阻塞和非阻塞真的只對accept有效,這一點不是很清楚,希望高手解釋一下.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章