C socket 關於connect超時設定

2021-08-21 07:59:16 字數 1234 閱讀 2937

使用阻塞的socket, 可以設定讀寫超時,

struct timeval tv_timeout; 

tv_timeout.tv_sec = 60; 

tv_timeout.tv_usec = 0; 

if (setsockopt(sockfd, sol_socket, so_sndtimeo, (void *) &tv_timeout, sizeof(struct timeval)) < 0)  

tv_timeout.tv_sec = 60; 

tv_timeout.tv_usec = 0; 

if (setsockopt(sockfd, sol_socket, so_rcvtimeo, (void *) &tv_timeout, sizeof(struct timeval)) < 0)  

但是這個不會影響connect.

如何設定connect超時呢, 通過訊號alarm? 感覺不是乙個好的辦法.比較好的辦法是通過select或者poll判斷超時.

首先設定socket fd為非阻塞, connect判斷返回值, 如果返回0, 說明connect成功, 如果返回值等於-1並且錯誤的errno為einprogress時呼叫select或者poll判斷socket fd的可寫狀態, 通過select或者poll的超時設定來判斷是否超時.

man page是這麼寫的

einprogress

the socket is non-blocking and the connection cannot be com-

pleted immediately. it is possible to select(2) or poll(2) for

completion by selecting the socket for writing. after select(2)

indicates writability, use getsockopt(2) to read the so_error

option at level sol_socket to determine whether connect() com-

pleted successfully (so_error is zero) or unsuccessfully

(so_error is one of the usual error codes listed here, explain-

ing the reason for the failure).

Linux socket非阻塞connect方法

socket non blocking mode connect 對於面向連線的socket型別 sock stream,sock seqpacket 在讀寫資料之前必須建立連線,connect 函式用於完成面向連線的socket的建鏈過程,對於tcp,也就是三次握手過程。connect 函式 標頭...

關於CSocket類的Receive超時的問題

不錯,搜到以下內容,很多 為csocket配置time out功能 csocket操作,如send receive connect 都屬阻塞操作,即它們在成功完成或錯誤發生之前是不會返回的。在某些情況下,某項操作可能永遠不能成功完成,程式為了等待其完成就得永遠迴圈下去。在程式中為某項操作限定乙個成功...

關於CSocket類的Receive超時的問題

不錯,搜到以下內容,很多 為csocket配置time out功能 csocket操作,如send receive connect 都屬阻塞操作,即它們在成功完成或錯誤發生之前是不會返回的。在某些情況下,某項操作可能永遠不能成功完成,程式為了等待其完成就得永遠迴圈下去。在程式中為某項操作限定乙個成功...