Установите время подключения с помощью setsockopt в Linux

Я пишу приложение 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));

2

Решение

Вместо того чтобы полагаться на setsockopt()почему бы вместо этого не установить сокет в неблокирующий режим и выполнить асинхронный connect(), Затем вы заблокируете select(), poll() или какой-либо механизм демультиплексирования событий, который вы используете, устанавливая тайм-аут на то, что вы хотите. Как только он становится доступным для записи, вы знаете, что соединение установлено.

0

Другие решения


По вопросам рекламы [email protected]