Russian Qt Forum

Qt => Работа с сетью => Тема начата: altVis от Февраль 27, 2008, 22:09



Название: "Зависание" программы при выходе после попытки tcp подключения без сети
Отправлено: altVis от Февраль 27, 2008, 22:09
Вечер добрый.
Проблема существует только при указании символьного адреса хоста сокету. ( видимо из-за поиска днс )
Действия:
- отключается кабель
- из программы пытаюсь подключиться к хосту ==> программа "не зависает"
- пытаюсь закрыть программу ==> программа "зависает"

Протокол tcp. qt 4.3.3

Не могу разобраться, что происходит. Деструкторы не вызываются, программа просто намертво "зависает".
Может есть какие-нибудь предположения?


Название: Re: "Зависание" программы при выходе после попытки tcp подключения без сети
Отправлено: ритт от Февраль 28, 2008, 02:02
попробуй тот же код на 4.3.4
до 4.3.4 была ошибка "бесконечного ожидания сокета при сбоях сети" - возможно, побочный эффект этой баги


Название: Re: "Зависание" программы при выходе после попытки tcp подключения без сети
Отправлено: altVis от Февраль 28, 2008, 16:25
Обновился, проблемы не решило :-[


Название: Re: "Зависание" программы при выходе после попытки tcp подключения без сети
Отправлено: BRE от Февраль 28, 2008, 17:56
Обновился, проблемы не решило :-[
Может немного кода.  ;)


Название: Re: "Зависание" программы при выходе после попытки tcp подключения без сети
Отправлено: altVis от Февраль 28, 2008, 19:52
Проблема несовсем в qt или в коде.
Из программы выхожу так :
func(){
...
qApp->quit();
}
Если после quit() указать какие-то действия, то они выполняются.
Пишу под линуксом. И видимо без демона отслеживающего подключение, система не оповещается о недоступности сети.
Яркий пример konqueror из KDE. При такой ситуации при запуске "виснет" на некоторое время.
Моя программа после подключения продолжает стабильно работать, но при выходе видимо не может получить ответа на запрос и продолжает ждать по timeout.
Пока в голову приходит только какой-нибудь аварийный выход из программы.


Название: Re: "Зависание" программы при выходе после попытки tcp подключения без сети
Отправлено: BRE от Февраль 28, 2008, 20:23
Давай так, в примерах есть Fortune Client, отключи сеть и попробуй подключиться все равно к какому хосту, если  ситуация повториться (подвис), проблема не в твоем коде, иначе смотреть твой код.
В общем, нужно как-то локализовать тот код, который приводит к зависанию. Если получиться сделать небольшую тестовую программку, которая будет воспроизводить данное поведение, это будет совсем гуд.


Название: Re: "Зависание" программы при выходе после попытки tcp подключения без сети
Отправлено: altVis от Февраль 28, 2008, 21:24
Простой пример:
Форма + кнопка

tst.cpp

#include "tst.h"

tst::tst(QWidget *parent)
    : QWidget(parent)
{
   ui.setupUi(this);
   QTcpSocket *socket = new QTcpSocket(this);
   socket->connectToHost("test.com", 1578);
}

tst::~tst()
{

}

void tst::on_pushButton_clicked()
{
      qApp->quit();
}


Зависает после нажатия кнопки.
Если вместо qApp->quit() указать close(), то выходит без проблем.
Попробовал выход из своей программы по close(). Программа "висит", остаётся иконка в трее, но главное окно закрывается.

И ещё вопрос, как можно очистить сокет, кроме как socket->read(socket->bytesAvailable())?


Название: Re: "Зависание" программы при выходе после попытки tcp подключения без сети
Отправлено: BRE от Февраль 28, 2008, 21:50
У меня не зависает.  ???  ;)
Возможно дело действительно в настройках сетевых служб в линуксе, и к Qt не относится.


Название: Re: "Зависание" программы при выходе после попытки tcp подключения без сети
Отправлено: pastor от Февраль 28, 2008, 22:22
А если попобывать перед qApp->quit() вызывать disconnectFromHost()?


Название: Re: "Зависание" программы при выходе после попытки tcp подключения без сети
Отправлено: Вячеслав от Февраль 28, 2008, 22:33
А если попобывать перед qApp->quit() вызывать disconnectFromHost()?
тогда уж abort() .
Или корркектнее таймер на пару секунд при выходе - есть соединения - abort им ;)


Название: Re: "Зависание" программы при выходе после попытки tcp подключения без сети
Отправлено: altVis от Февраль 29, 2008, 22:48
отсоединяться я первым делом пробовал  :-[


Название: Re: "Зависание" программы при выходе после попытки tcp подключения без сети
Отправлено: Вячеслав от Февраль 29, 2008, 22:53
пробывал что дисконнект или аборт ? Дисконнект пытаеться данные сначала заслать, а аборт убивает сокет сразу ...


Название: Re: "Зависание" программы при выходе после попытки tcp подключения без сети
Отправлено: altVis от Март 01, 2008, 11:00
Ну конечно же и то, и то.
И просто удалять сокет из памяти пробовал, по нажатию кнопки.


Название: Re: "Зависание" программы при выходе после попытки tcp подключения без сети
Отправлено: Вячеслав от Март 01, 2008, 12:25
Хм ..... а если ручками попробывать имя отрезолвить через QHostInfo в отдельном потоке(с таймаутом) а потом цепляться к апишнику .... Хотя странно, я как-то по запаре сунул левый адрес в сетке- (не имя) таки прога вешалась внутре libc на connect'e ,  но через некоторое время оживала и шла резервные адреса пробывать .....


Название: Re: "Зависание" программы при выходе после попытки tcp подключения без сети
Отправлено: ant_studio от Март 14, 2008, 11:07
altVis
А сигнал о потере (закрытии) соединения ты получаешь?