Socket連線超時設定

2021-08-23 14:20:49 字數 2321 閱讀 7754

原文連線:

一.基本概念(摘自:《unix網路程式設計》卷1 14.2 套接字超時)

在涉及套接字的i/o操作上設定超時的方法有以下三種

(1)呼叫alarm,它在指定超時期滿時產生sigalarm。這個方法涉及訊號處理,而訊號處理在不同的實現上存在差異,而且可能干擾程序中現有的alarm呼叫。

(2)在select中阻塞等待i/o(select有內建的時間限制),以此替代直接阻塞在readwrite呼叫上。

(3)使用so_recvtimeoso_sndtimeo套接字選項

上述三個技術都適用於輸入輸出操作(例如readwrite及其諸如recvfromsendto之類的變體),不過我們依然期待可用於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...