在Linux中使用setsockopt设置连接超时

时间:2014-09-19 14:44:00

标签: c++ qt qtcpsocket setsockopt

我正在编写一个Linux Qt5 / c ++应用程序,尝试使用QTcpSocket连接到对等方。我打电话给

tcpsocket->connectToHost(address,port,options)

当对等体可用时,它可以很好地连接并立即连接。但是,当对等体不可用时:第一次调用上面的内容时,连接在收到SocketTimeoutError(5)之前等待1分钟。然后,每次后续连接调用可能会在我收到ConnectionRefusedError(0)之前等待一秒钟,或者可能等待一整分钟(取决于测试的系统)。

我可以使用setsockopt来减少等待初始连接的时间吗?

我应该指出,我已经设置了一些套接字选项,以便快速通知我丢失的连接(见下文)。希望这些不会导致1分钟的初始连接错误延迟:

int enableKeepAlive = 1;
setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &enableKeepAlive, sizeof(enableKeepAlive));
int maxIdle = 5; /* seconds */
setsockopt(fd, IPPROTO_TCP, TCP_KEEPIDLE, &maxIdle, sizeof(maxIdle));
int count = 3;  // send up to 3 keepalive packets out, then disconnect if no response
setsockopt(fd, SOL_TCP, TCP_KEEPCNT, &count, sizeof(count));
int interval = 2;   // send a keepalive packet out every 2 seconds (after the 5 second idle period)
setsockopt(fd, SOL_TCP, TCP_KEEPINTVL, &interval, sizeof(interval));

1 个答案:

答案 0 :(得分:0)

与其依赖setsockopt(),为什么不要将套接字设置为非阻塞模式并执行异步connect()。然后,您将阻止select()poll()或您正在使用的任何事件多路分解机制,将超时设置为您想要的任何内容。一旦它变得可写,你就知道连接已经完成。