1. 程式人生 > >非阻塞connect問題

非阻塞connect問題

        在發起一個網路連線時,如果不知道伺服器是否正常,我們經常會阻塞在connect,在《linux網路程式設計》一書中講述了使用select 實現非阻塞connect的方法,基本步驟如下:

1、建立 socket,返回套接字描述符;

2、呼叫 fcntl 或 ioctlsocket 把套介面描述符設定成非阻塞;

3、呼叫 connect 開始建立連線

4、判斷連線是否成功建立

5、呼叫select 等待套接安變為可讀或可寫;

6、處理超時;

7、檢查可讀或可寫條件;

8、關閉非阻塞狀態並返回;

       一般情況下,這個方法會執行的很正常,但,讓我們考慮以下這種情況:

    伺服器使用epoll模式接受客戶端連線,並且往一箇中心伺服器同步一些資料,當與中心伺服器通訊出現問題時,會斷開連線並使用上面的非阻塞方法重新進行連線,這時問題就出現了,如果當時客戶端連線數量大於FD_SETSIZE,並且有客戶端不斷進入,那伺服器連線中心伺服器時,建立的描述符值就可能大於FD_SETSIZE,這時使用select就會出錯,造成伺服器無法連線上中心伺服器。

在上述情況中,需要改用poll或epoll方式替代select來等待套接安變為可讀或可寫。