我寫一個小的網絡工具,在某個地方在我的代碼,我有以下行:如何設置connect()的超時時間以及如何測量它?
if (connect(sock, addr_result->ai_addr, addr_result->ai_addrlen) < 0)
syserr("connect");
我有一個關於超時兩個問題:
- 如何設置超時爲
connect()
使用Linux API? - 如果我想自己測量超時,那麼執行此操作的正確方法是什麼?
我寫一個小的網絡工具,在某個地方在我的代碼,我有以下行:如何設置connect()的超時時間以及如何測量它?
if (connect(sock, addr_result->ai_addr, addr_result->ai_addrlen) < 0)
syserr("connect");
我有一個關於超時兩個問題:
connect()
使用Linux API?爲SIGALARM註冊信號處理程序。在連接返回之前調用連接之前設置警報並清除警報,如果你點擊信號處理程序,那麼它是連接超時。
設置套接字非阻塞,發出connect(),
然後使用select()
或poll()
或epoll()
以超時,選擇可寫。
我不知道'你測量超時'是什麼意思。
使用非阻塞連接並使用select或poll或epoll超時。這是示例。
int fd = socket(PF_INET,SOCK_STREAM,0);
int flags = fcntl(fd,F_GETFL);
if (flags >= 0)
flags = fcntl(fd, F_SETFL, flags | O_NONBLOCK);
int n = connect(fd, (struct sockaddr*)&addr, sizeof addr);
if(n < 0)
{
if(errno != EINPROGRESS && errno != EWOULDBLOCK)
return 1;
struct timeval tv;
tv.tv_sec = 10;
tv.tv_usec = 0;
fd_set wset;
FD_ZERO(&wset);
FD_SET(fd,&wset);
n = select(fd+1,NULL,&wset,NULL,&tv);
if(n < 0)
{
close(fd);
return 1;
}
else if (0 == n)
{ // timeout
cerr<< "Timeout." << endl;
close(fd);
return 1;
}
else
{ // connect success
cerr << "Connectd." <<endl;
}
}