Я пишу приложение Linux Qt5 / c ++, которое пытается подключиться к пиру с помощью QTcpSocket. Я звоню
tcpsocket->connectToHost(address,port,options)
Когда узел доступен, он отлично работает и сразу подключается. Тем не менее, когда одноранговый узел недоступен: в первый раз, когда я вызываю вышеупомянутое, подключение ждет 1 минуту, прежде чем я получу SocketTimeoutError (5). Затем каждый последующий вызов для подключения может подождать секунду, прежде чем я получу ConnectionRefusedError (0), или может подождать целую минуту (в зависимости от протестированной системы).
Есть ли setockopt, который я могу использовать, чтобы сократить время ожидания начального подключения?
Я должен отметить, что я уже установил некоторые параметры сокетов, чтобы быстро уведомить меня о потерянном соединении (см. Ниже). Надеемся, что это не вызывает 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));
Вместо того чтобы полагаться на setsockopt()
почему бы вместо этого не установить сокет в неблокирующий режим и выполнить асинхронный connect()
, Затем вы заблокируете select()
, poll()
или какой-либо механизм демультиплексирования событий, который вы используете, устанавливая тайм-аут на то, что вы хотите. Как только он становится доступным для записи, вы знаете, что соединение установлено.