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...