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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: "Зависание" программы при выходе после попытки tcp подключения без сети  (Прочитано 11655 раз)
altVis
Гость
« : Февраль 27, 2008, 22:09 »

Вечер добрый.
Проблема существует только при указании символьного адреса хоста сокету. ( видимо из-за поиска днс )
Действия:
- отключается кабель
- из программы пытаюсь подключиться к хосту ==> программа "не зависает"
- пытаюсь закрыть программу ==> программа "зависает"

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

Не могу разобраться, что происходит. Деструкторы не вызываются, программа просто намертво "зависает".
Может есть какие-нибудь предположения?
« Последнее редактирование: Февраль 27, 2008, 22:15 от altVis » Записан
ритт
Гость
« Ответ #1 : Февраль 28, 2008, 02:02 »

попробуй тот же код на 4.3.4
до 4.3.4 была ошибка "бесконечного ожидания сокета при сбоях сети" - возможно, побочный эффект этой баги
Записан
altVis
Гость
« Ответ #2 : Февраль 28, 2008, 16:25 »

Обновился, проблемы не решило Обеспокоенный
Записан
BRE
Гость
« Ответ #3 : Февраль 28, 2008, 17:56 »

Обновился, проблемы не решило Обеспокоенный
Может немного кода.  Подмигивающий
Записан
altVis
Гость
« Ответ #4 : Февраль 28, 2008, 19:52 »

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

Давай так, в примерах есть Fortune Client, отключи сеть и попробуй подключиться все равно к какому хосту, если  ситуация повториться (подвис), проблема не в твоем коде, иначе смотреть твой код.
В общем, нужно как-то локализовать тот код, который приводит к зависанию. Если получиться сделать небольшую тестовую программку, которая будет воспроизводить данное поведение, это будет совсем гуд.
Записан
altVis
Гость
« Ответ #6 : Февраль 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())?
« Последнее редактирование: Февраль 28, 2008, 21:30 от altVis » Записан
BRE
Гость
« Ответ #7 : Февраль 28, 2008, 21:50 »

У меня не зависает.  Непонимающий  Подмигивающий
Возможно дело действительно в настройках сетевых служб в линуксе, и к Qt не относится.
« Последнее редактирование: Февраль 28, 2008, 21:57 от BRE » Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #8 : Февраль 28, 2008, 22:22 »

А если попобывать перед qApp->quit() вызывать disconnectFromHost()?
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Вячеслав
Гость
« Ответ #9 : Февраль 28, 2008, 22:33 »

А если попобывать перед qApp->quit() вызывать disconnectFromHost()?
тогда уж abort() .
Или корркектнее таймер на пару секунд при выходе - есть соединения - abort им Подмигивающий
Записан
altVis
Гость
« Ответ #10 : Февраль 29, 2008, 22:48 »

отсоединяться я первым делом пробовал  Обеспокоенный
Записан
Вячеслав
Гость
« Ответ #11 : Февраль 29, 2008, 22:53 »

пробывал что дисконнект или аборт ? Дисконнект пытаеться данные сначала заслать, а аборт убивает сокет сразу ...
Записан
altVis
Гость
« Ответ #12 : Март 01, 2008, 11:00 »

Ну конечно же и то, и то.
И просто удалять сокет из памяти пробовал, по нажатию кнопки.
Записан
Вячеслав
Гость
« Ответ #13 : Март 01, 2008, 12:25 »

Хм ..... а если ручками попробывать имя отрезолвить через QHostInfo в отдельном потоке(с таймаутом) а потом цепляться к апишнику .... Хотя странно, я как-то по запаре сунул левый адрес в сетке- (не имя) таки прога вешалась внутре libc на connect'e ,  но через некоторое время оживала и шла резервные адреса пробывать .....
Записан
ant_studio
Гость
« Ответ #14 : Март 14, 2008, 11:07 »

altVis
А сигнал о потере (закрытии) соединения ты получаешь?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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