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