Russian Qt Forum

Qt => Работа с сетью => Тема начата: alexandr_ps от Январь 12, 2009, 14:37



Название: Проблемы с соединением по TCP/IP
Отправлено: alexandr_ps от Январь 12, 2009, 14:37
Здраствуйте!

Есть клиент-серверное приложение(связка QTcpServer - QTcpSocket), при этом клиент должен отслеживать работает ли сервер. Когда связка клиент-сервер работает, и я программно закрываю приложение-сервер, у клиента вызывается сигнал ошибки error(), и я знаю, что соединение пропало. Но, когда происходит физическая потеря коннекта (тупо выдергиваю кабель из сетевой карты), ни сигнал disconnected(), ни error(), ни stateChanged() не вызываются и как узнать о том, что соединения пропало неясно. Насколько я знаю TCP/IP должен отслеживать такие вещи. В связи с этим вопрос, что не так и как поправить?

P.S. SuSe Linux 10.3, Qt 4.3.2 на клиенте и на сервере

Заранее спасибо!


Название: Re: Проблемы с соединением по TCP/IP
Отправлено: vaprele07 от Январь 12, 2009, 15:43
пингом. еще есть такая хрень "keep alive" держать соединение при разрыве... http://www.ibase.ru/devinfo/keepalive.htm


Название: Re: Проблемы с соединением по TCP/IP
Отправлено: alexandr_ps от Январь 13, 2009, 17:15
Спасибо за советы! Но проблему так и не решил :(

Пингом это как? Самому постоянно присылать пакет с оповещением что сеть работает? Или ping'ом вручную от клиента сервер пинговать :)?
По поводу keepalive. Вроде то что надо, но проблема в том, что изменение стандартных параметров в ОС как описано в статье ни к чему не привело. Все равно ноль реакции, состояние соединения в QTcpSocket не меняется. Проблема в ОС или Qt, но в чем - не знаю. Есть идеи?



Название: Re: Проблемы с соединением по TCP/IP
Отправлено: vaprele07 от Январь 14, 2009, 05:40
оказалось что кутэ не юзает SO_KEEPALIVE по этому ручками это будет выглядеть так:
Код:
#include <sys/socket.h>

tcpServer->listen(...); //инициализация
...
int opt = 1, len = sizeof(opt);
setsockopt(tcpServer->socketDescriptor(), SOL_SOCKET, SO_KEEPALIVE, &opt,  len);
...

http://tldp.org/HOWTO/html_single/TCP-Keepalive-HOWTO/
кстати если соединение через дслмодем а он в свою очередь рутером там тоже есть кипалив


Название: Re: Проблемы с соединением по TCP/IP
Отправлено: Rcus от Январь 14, 2009, 07:41
http://www.faqs.org/rfcs/rfc1122.html
Цитировать
   4.2.3.6  TCP Keep-Alives

            Implementors MAY include "keep-alives" in their TCP
            implementations, although this practice is not universally
            accepted.
Дальше можно и не читать. Наверно поэтому все известные мне сетевые протоколы уровня приложений реализуют свою систему keepalive через пакеты специального типа
Например в сетевом протоколе игры Anarchy Online поток данных разбивается на пакеты вида [ushort type][ushort size][byte data[size]] и для поддержания соединения используется пакет [0x64][0x00]


Название: Re: Проблемы с соединением по TCP/IP
Отправлено: alexandr_ps от Январь 14, 2009, 09:52
Всем большое спасибо за помощь!

Буду реализовывать свой keepalive в приложении :)