我正在编写一个小型网络实用程序,在我的代码中的某处我有以下几行:
if (connect(sock, addr_result->ai_addr, addr_result->ai_addrlen) < 0)
syserr("connect");
我有两个关于超时的问题:
connect()
设置超时?答案 0 :(得分:1)
为SIGALARM注册信号处理程序。在调用connect之前设置警报并在连接返回后清除警报,如果你按下信号处理程序然后它的连接超时。
答案 1 :(得分:1)
使用非阻塞连接并使用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;
}
}
答案 2 :(得分:0)
将套接字设置为非阻止,发出connect(),
然后使用select()
或poll()
或epoll()
超时,选择可写性。
我不知道你的意思是&#39;测量超时&#39;。