對於非阻塞connect的一點認識

2021-06-04 20:58:53 字數 637 閱讀 9487

一般如下:

connect();

select();

由於是非阻塞,很自然connect立即返回,而不同於阻塞條件下的成功或者失敗才返回。

對於tcp來說,非阻塞的connect會立即返回乙個錯誤einprogress,而且完成3路握手。

對於udp來說,個人覺得,由於核心只是檢查是否存在立即可知的錯誤,並記錄對方的ip和埠號,沒必要使用非阻塞的connect。

正常情況:

如果connect成功,select會發現套接字變得可寫。出錯的話套接字變得可寫且可讀。

極端情況:

connect於select之間並非原子操作,存在時間間隙。如果這個時候connect成功且收到一些資料的話,這個時候套接字由於有資料可讀變得可讀,又由於connect成功變得可寫。

這樣會導致本來connect成功,卻誤當做發生錯誤。

解決辦法:

1.既然connect成功,那就用getpeername獲取遠端位址。如果出現enotconn錯誤,則表示connect失敗。 個人覺得這條方案不太好。

2.以值0呼叫read,如果read失敗,那麼connect失敗,鏈結成功read返回0. 

3.再呼叫一次connect一次,如果錯誤為eisconn,那麼套介面已經連線成功。

非阻塞connect的實現

需要非阻塞connec的幾種情況 1.三路握手需要時間,這個要視具體的網路情況而定。當然也有可能失敗。在三路握手的時候我們並不需要在原地等待三路握手的完成,可以用這些時間來完成其它事情,然後當這些事情完成後,再去檢測連線是否建立 也就是三路握手是否完成 2.可以用這種技術來同時建立多個連線。web瀏...

關於connect前設定非阻塞的問題

此處僅設定socket的狀態為ss connecting表示連線狀態正在處理 不同之處在於非阻塞情況下,返回值設定為 einprogress表示操作正在處理 而阻塞式情況則在獲得ack包後將返回值置為 ealready.err einprogress break timeo sock sndtime...

關於connect需要注意的一點

這次要談的是connect 函式,出現的問題同樣是因為某條語句寫在了在迴圈之外。socket socket af inet,sock stream,0 中間省略 while 1 按照上面的 執行,當第一次沒有連線上,再進行第二次的連線時,如果此時連線成功,程式接著執行,便會被訊號中斷。後來調查發現,...