首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为connect()设置超时,以及如何度量它?

如何为connect()设置超时,以及如何度量它?
EN

Stack Overflow用户
提问于 2015-04-28 07:51:33
回答 3查看 374关注 0票数 1

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

代码语言:javascript
复制
if (connect(sock, addr_result->ai_addr, addr_result->ai_addrlen) < 0)
  syserr("connect");

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

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

回答 3

Stack Overflow用户

发布于 2015-04-28 07:58:54

为SIGALARM注册信号处理程序。在调用连接之前设置警报,在连接返回后清除警报,如果您按下信号处理程序,则连接超时。

票数 1
EN

Stack Overflow用户

发布于 2015-04-28 09:33:00

使用非阻塞连接,并使用select或轮询或epoll作为超时。这是样品。

代码语言:javascript
复制
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; 
    } 
} 
票数 1
EN

Stack Overflow用户

发布于 2015-04-28 08:28:00

将套接字设置为非阻塞,发出connect(),,然后使用select()poll()epoll()进行超时,选择可写性。

我不知道你所说的“测量超时时间”是什么意思。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29913483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档