設定socket connect超時時間的幾種方法

2021-09-25 12:14:13 字數 2046 閱讀 6242

int connecttimeout =30;

setsockopt

(sock, ipproto_tcp, tcp_connectiontimeout,

(char*)

&connecttimeout,

sizeof

(connecttimeout)

);

socket選項tcp_syncnt可以控制tcp連線syn重傳次數,預設為0,為0時syn重傳次數由系統引數 net.ipv4.tcp_syn_retries 控制,該系統引數預設值為6。

syn重傳次數影響connect超時時間,當重傳次數為6時,超時時間為1+2+4+8+16+32+64=127秒。

int syncnt =4;

setsockopt

(sock, ipproto_tcp, tcp_syncnt,

&syncnt,

sizeof

(syncnt)

);

建立socket,將socket設定為非阻塞模式。

呼叫connect連線,如果能立即連線則返回0,不能立即連線返回-1,這個時候判斷錯誤碼是否表示暫時不能完成,是的話繼續下一步。

接著呼叫select()在指定的時間內檢測socket是否可寫,如果可寫表明connect()連線成功,0表示超時,-1表示出現了錯誤。

windows下**:

void

attemptconnect

(const

char

* ip,

unsigned

short port,

int timeout)

socket connectsocket= invalid_socket;

do//socket設定為非阻塞

unsigned

long on =1;

if(ioctlsocket

(connectsocket, fionbio,

&on)

<0)

//嘗試連線

sockaddr_in clientservice;

clientservice.sin_family = af_inet;

clientservice.sin_addr.s_addr =

inet_addr

(ip)

; clientservice.sin_port =

htons

(port)

;int ret =

connect

(connectsocket,

(struct sockaddr*

)&clientservice,

sizeof

(clientservice));

if(ret ==0)

//因為是非阻塞的,這個時候錯誤碼應該是wsaewouldblock,linux下是einprogress

if(ret <0&&

wsagetlasterror()

!= wsaewouldblock)

fd_set writeset;

fd_zero

(&writeset)

;fd_set

(connectsocket,

&writeset)

; timeval tv;

tv.tv_sec = timeout;

tv.tv_usec =0;

ret =

select

(connectsocket +1,

null

,&writeset,

null

,&tv);if

(ret ==0)

else

if(ret <0)

else

}while

(false);if

(connectsocket != invalid_socket)

wsacleanup()

;}intmain()

socket connect 函式設定超時

眾所周知,在進行網路程式設計的時候,如果使用系統connect函式,無法設定超時,而在連線乙個不存在的主機時,將會一直阻塞。其實在呼叫connect函式時,將控制代碼設定為非阻塞,然後呼叫select函式,可以達到設定超時的效果。cpp view plain copy print?bool conn...

socket connect 函式設定超時

眾所周知,在進行網路程式設計的時候,如果使用系統connect函式,無法設定超時,而在連線乙個不存在的主機時,將會一直阻塞。其實在呼叫connect函式時,將控制代碼設定為非阻塞,然後呼叫select函式,可以達到設定超時的效果。cpp view plain copy bool connect ch...

socket connect函式理解

1 connect描述 定義函式 int connect int sockfd,struct sockaddr serv addr,int addrlen connect函式通常用於客戶端建立tcp連線。返回值 成功則返回0,失敗返回 1,錯誤原因存於errno中。錯誤 ebadf 引數sockfd...