Я пишу приложение Linux Qt5/C++, которое пытается подключиться к одноранговому узлу с помощью QTcpSocket. Я звонюУстановить соединение с использованием setsockopt в Linux
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));
Я нашел одну ссылку на google для setsockopt (socket_handle, SOL_TCP, OPT_CONNECT_TIMEOUT и параметр sizeof (опция)), но он не будет компилироваться, поскольку нет OP_CONNECT_TIMEOUT (по крайней мере, не в моих заголовках) – TSG