Russian Qt Forum
Ноябрь 23, 2024, 01:45 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблемы с соединением по TCP/IP  (Прочитано 6052 раз)
alexandr_ps
Гость
« : Январь 12, 2009, 14:37 »

Здраствуйте!

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

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

Заранее спасибо!
Записан
vaprele07
Гость
« Ответ #1 : Январь 12, 2009, 15:43 »

пингом. еще есть такая хрень "keep alive" держать соединение при разрыве... http://www.ibase.ru/devinfo/keepalive.htm
Записан
alexandr_ps
Гость
« Ответ #2 : Январь 13, 2009, 17:15 »

Спасибо за советы! Но проблему так и не решил Грустный

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

Записан
vaprele07
Гость
« Ответ #3 : Январь 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/
кстати если соединение через дслмодем а он в свою очередь рутером там тоже есть кипалив
Записан
Rcus
Гость
« Ответ #4 : Январь 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]
Записан
alexandr_ps
Гость
« Ответ #5 : Январь 14, 2009, 09:52 »

Всем большое спасибо за помощь!

Буду реализовывать свой keepalive в приложении Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.132 секунд. Запросов: 20.