1.首先將標誌位設為Non-blocking模式,準備在非阻塞模式下呼叫connect函式
2.呼叫connect,正常情況下,因為TCP三次握手需要一些時間;而非阻塞呼叫只要不能立即完成就會返回錯誤,所以這裡會返回EINPROGRESS,表示在建立連線但還沒有完成。
3.在讀套介面描述符集(fd_set rset)和寫套介面描述符集(fd_set
wset)中將當前套介面置位(用FD_ZERO()、FD_SET()宏),並設定好超時時間(struct
timeval *timeout)
4.呼叫select( socket, &rset, &wset, NULL, timeout )
返回0表示connect超時
如果你設定的超時時間大於75秒就沒有必要這樣做了,因為核心中對connect有超時限制就是75秒。
網路程式設計中socket的分量我想大家都很清楚了,socket也就是套介面,在套介面程式設計中,提到超時的概念,我們一下子就能想到3個:傳送超時,接收超時,以及select超時(注:
select
函式並不是只用於套介面的,但是套介面程式設計中用的比較多),在connect到目標主機的時候,這個超時是不由我們來設定的。不過正常情況下這個超時都很
長,並且connect又是一個阻塞方法,一個主機不能連線,等著connect返回還能忍受,你的程式要是要試圖連線多個主機,恐怕遇到多個不能連線的
主機的時候,會塞得你受不了的。我也廢話少說,先說說我的方法,如果你覺得你已掌握這種方法,你就不用再看下去了,如果你還不瞭解,我願意與你分享。本文
是已在Linux下的程式為例子,不過拿到Windows中方法也是一樣,無非是換幾個函式名字罷了。
1.首先將標誌位設為Non-blocking模式,準備在非阻塞模式下呼叫connect函式
2.呼叫connect,正常情況下,因為TCP三次握手需要一些時間;而非阻塞呼叫只要不能立即完成就會返回錯誤,所以這裡會返回EINPROGRESS,表示在建立連線但還沒有完成。
3.在讀套介面描述符集(fd_set rset)和寫套介面描述符集(fd_set
wset)中將當前套介面置位(用FD_ZERO()、FD_SET()宏),並設定好超時時間(struct
timeval *timeout)
4.呼叫select( socket, &rset, &wset, NULL, timeout )
返回0表示connect超時
如果你設定的超時時間大於75秒就沒有必要這樣做了,因為核心中對connect有超時限制就是75秒。
網路程式設計中socket的分量我想大家都很清楚了,socket也就是套介面,在套介面程式設計中,提到超時的概念,我們一下子就能想到3個:傳送超時,接收超時,以及select超時(注:
select
函式並不是只用於套介面的,但是套介面程式設計中用的比較多),在connect到目標主機的時候,這個超時是不由我們來設定的。不過正常情況下這個超時都很
長,並且connect又是一個阻塞方法,一個主機不能連線,等著connect返回還能忍受,你的程式要是要試圖連線多個主機,恐怕遇到多個不能連線的
主機的時候,會塞得你受不了的。我也廢話少說,先說說我的方法,如果你覺得你已掌握這種方法,你就不用再看下去了,如果你還不瞭解,我願意與你分享。本文
是已在Linux下的程式為例子,不過拿到Windows中方法也是一樣,無非是換幾個函式名字罷了。