如何设置connect()的超时以及如何测量它?

时间:2015-04-28 07:51:33

标签: c linux sockets network-programming connection-timeout

我正在编写一个小型网络实用程序,在我的代码中的某处我有以下几行:

if (connect(sock, addr_result->ai_addr, addr_result->ai_addrlen) < 0)
  syserr("connect");

我有两个关于超时的问题:

  1. 如何使用Linux API为connect()设置超时?
  2. 如果我想自己测量超时,那么这样做的正确方法是什么?

3 个答案:

答案 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;。