1. 程式人生 > >設定socket的Connect超時

設定socket的Connect超時

 此外我需要說明的幾點是,雖然我們用ioctl把套介面設定為非阻塞模式,不過select本身是阻塞的,阻塞的時間就是其超時的時間由呼叫select 的時候的最後一個引數timeval型別的變數指標指向的timeval結構變數來決定的,timeval結構由一個表示秒數的和一個表示微秒數(long型別)的成員組成,一般我們設定了秒數就行了,把微妙數設為0(注:1秒等於100萬微秒)。而select函式另一個值得一提的引數就是上面我們用到的fd_set型別的變數指標。呼叫之前,這個變數裡面存了要用select來檢查的描述符,呼叫之後,針對上面的程式這裡面是可寫的描述符,我們可以用巨集FD_ISSET來檢查某個描述符是否在其中。由於我這裡只有一個套介面描述符,我就沒有使用
FD_ISSET巨集來檢查呼叫select之後這個sockfd是否在set裡面,其實是需要加上這個判斷的。不過我用了getsockopt來檢查,這樣才可以判斷出這個套介面是否是真的連線上了,因為我們只是變相的用select來檢查它是否連線上了,實際上select檢查的是它是否可寫,而對於可寫,是針對以下三種條件任一條件滿足時都表示可寫的:
1
)套介面傳送緩衝區中的可用控制元件位元組數大於等於套介面傳送緩衝區低潮限度的當前值,且或者i)套介面已連線,或者ii)套介面不要求連線(UDP方式的)
2
)連線的寫這一半關閉。
3
)有一個套介面錯誤待處理。這樣,我們就需要用getsockopt函式來獲取套介面目前的一些資訊來判斷是否真的是連線上了,沒有連線上的時候還能給出發生了什麼錯誤,當然我程式中並沒有標出那麼多狀態,只是簡單的表示可連線
/不可連線。