2014-09-19 1 views
2

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

Я нашел одну ссылку на google для setsockopt (socket_handle, SOL_TCP, OPT_CONNECT_TIMEOUT и параметр sizeof (опция)), но он не будет компилироваться, поскольку нет OP_CONNECT_TIMEOUT (по крайней мере, не в моих заголовках) – TSG

ответ

0

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

+0

Я уже делаю не- блокируя соединение, что приводит к сигналу socketerror. (Использование QT, чтобы не выбирать или опроса). Я понимаю, что я мог бы также запустить отдельный таймер для истечения более короткого промежутка времени, но я ищу вариант сокета. – TSG

+0

@GenerationDSystems: Кажется странным, что вам нужно установить параметр сокета, чтобы сделать неблокирующий тайм-аут подключения вообще. Из того, что я понимаю ['connectToHost()'] (http://qt-project.org/doc/qt-5/qabstractsocket.html#connectToHost) должен немедленно возвращаться без тайм-аута и испускать сигнал 'connected()' как только соединение будет установлено. Я нашел [старую запись о подобной проблеме] (http://www.qtcentre.org/threads/37051-QTcpSocket-connectToHost%28%29-is-blocking-the-GUI!), Которая подразумевала это возможно, была проблемой системы/драйвера. Возникает ли проблема на других платформах? – Void

+0

Я не думаю, что вы поняли вопрос. Я хочу установить максимальное время, которое сокет попытается подключить, прежде чем выпустить сигнал ошибки. На данный момент это 1 минута, мне это нужно <5 секунд – TSG