原文連線:
一.基本概念(摘自:《unix網路程式設計》卷1 14.2 套接字超時)
在涉及套接字的i/o操作上設定超時的方法有以下三種
(1)呼叫alarm,它在指定超時期滿時產生sigalarm。這個方法涉及訊號處理,而訊號處理在不同的實現上存在差異,而且可能干擾程序中現有的alarm呼叫。
(2)在select中阻塞等待i/o(select有內建的時間限制),以此替代直接阻塞在read或write呼叫上。
(3)使用so_recvtimeo和so_sndtimeo套接字選項
上述三個技術都適用於輸入輸出操作(例如read、write及其諸如recvfrom、sendto之類的變體),不過我們依然期待可用於connect的技術,因為tcp內建的connect超時相當長(典型值為75秒鐘)。select可用來在connect上設定超時的先決條件是相應的套接字是處於非阻塞模式,而那兩個套接字選項對connect並不適用。我們還指出,前兩個技術適用於任何描述符,而第三個技術僅僅適用於套接字描述符。
注:阻塞模式下,當伺服器連線不上時,通過命令 「netstat -tlnap|grep sent」 可以看到客戶端會處於syn_sent狀態,直到connect超時
二.非阻塞模式socket
1.connect不需要考慮超時問題,立即返回乙個錯誤einprogress,可通過檢測fd是否可用判斷連線是否建立完成
2.read不需要考慮超時問題,立即返回
3.write不需要考慮超時問題,立即返回
三.阻塞模式socket
1.connect需要考慮超時問題,否則當連線ip不可達的情況下,需要等待很長一段時間(預設時長)
2.read需要考慮超時問題,可通過setsockopt設定so_recvtimeo選項
3.write需要考慮超時問題,可通過setsockopt設定so_sndtimeo選項
四.帶超時的connect,適用於阻塞模式與非阻塞模式socket(本質上是非阻塞connect)
附上測試**,可通過更改main中的ip和埠進行測試,讀懂這段**需要了解select與getsockopt函式
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
int connect_nonb(int sockfd, const
struct sockaddr *addr, socklen_t addrlen, int nsec)
/* 檢查可讀或可寫條件,呼叫getsockopt取得套接字的待處理錯誤,如果建立成功,該值將為0 */
if (fd_isset(sockfd, &rset) || fd_isset(sockfd, &wset)) else
/* 恢復套接字的檔案狀態標誌並返回 */
done:
fcntl(sockfd, f_setfl, flags); /* restore file status flags */
if (error)
return(0);
}int main()
printf("connect success!\n");
return
0;}
參考:《unix網路程式設計》卷1 Socket中如何設定連線超時
設定connect的超時很簡單,csdn上也有人提到過使用select,但卻沒有乙個令人滿意與完整的答案。偶所講的也正是select函式,此函式整合在winsock1.1中,簡單點講,作用使那些想避免在套接字呼叫過程中被鎖定的應用程式,採取一種有序的方式,同時對多個套接字進行管理 windows網路...
Socket中如何設定連線超時
socket中如何設定連線超時 設定connect的超時很簡單,csdn上也有人提到過使用select,但卻沒有乙個令人滿意與完整的答案。偶所講的也正是select函式,此函式整合在winsock1.1中,簡單點講,作用使那些想避免在套接字呼叫過程中被鎖定的應用程式,採取一種有序的方式,同時對多個套...
Socket中如何設定連線超時
1.create socket struct sockaddr in addr addr.sin family af i server address addr.sin addr.s addr i addr host server port addr.sin port htons port crea...