Я пишу приложение Linux Qt5/С++, которое пытается подключиться к узлу с помощью QTcpSocket. Я звоню
tcpsocket->connectToHost(address,port,options)
Когда одноранговый узел доступен, он отлично работает и сразу же подключается. Однако, когда одноранговый узел недоступен: при первом вызове вышеуказанного соединение ждет 1 минуту, прежде чем я получу ошибку SocketTimeoutError (5). Затем каждый последующий вызов для подключения может ждать секунду, прежде чем я получу 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));