【问题标题】:Tuning socket connect call timeout调整套接字连接调用超时
【发布时间】:2010-09-22 00:50:23
【问题描述】:

在 Win32 环境中是否有任何方法可以“调整”套接字 connect() 调用的超时?具体来说,我想增加超时长度。正在使用的套接字是非阻塞的。谢谢!

【问题讨论】:

    标签: winapi sockets timeout connect


    【解决方案1】:

    是的,这是可能的。

    如果您在connect() 之后处于非阻塞模式,您通常使用select() 等待I/O 准备好。该函数有一个参数用于指定超时值,超时时返回0。

    【讨论】:

    • 不,这是不可能的。默认连接超时时间可以减少但不能增加。
    【解决方案2】:

    您可以尝试使用 SO_RCVTIMEO 和 SO_SNDTIMEO 套接字选项来设置任何套接字操作的超时。示例:

    struct timeval timeout;      
    timeout.tv_sec = 10;
    timeout.tv_usec = 0;
    
    if (setsockopt (sockfd, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout,
                sizeof(timeout)) < 0)
        error("setsockopt failed\n");
    
    if (setsockopt (sockfd, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout,
                sizeof(timeout)) < 0)
        error("setsockopt failed\n");
    

    你也可以试试alarm()。示例:

    signal( SIGALRM, connect_alarm ); /* connect_alarm is you signal handler */
    alarm( secs ); /* secs is your timeout in seconds */
    if ( connect( fd, addr, addrlen ) < 0 )
    {
        if ( errno == EINTR ) /* timeout, do something below */
            ...
    }
    alarm( 0 ); /* cancel the alarm */
    

    【讨论】:

    • 接收和发送超时与连接超时无关。
    【解决方案3】:

    不,这是不可能的。默认连接超时可以减少,但不能增加。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-08
      • 1970-01-01
      • 2011-05-11
      • 1970-01-01
      • 2021-03-05
      • 1970-01-01
      • 2012-11-17
      • 2011-02-05
      相关资源
      最近更新 更多