Russian Qt Forum
Июля 03, 2025, 08:17 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: "Зависание" программы при выходе после попытки tcp подключения без сети  (Прочитано 12011 раз)
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.022 секунд. Запросов: 20.