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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Решено] Завершение соединения между клиентом и сервером. Соединение висит 2 мин  (Прочитано 5303 раз)
pawok11
Гость
« : Февраль 05, 2010, 15:42 »

Запущен QTcpServer. На каждое входящее сообщение запускается свой поток обработки QThread, в котором вызывается QTcpSocket. После окончания обмена данными QTcpSocket закрывается
  
Код:
 tcpSocket->disconnectFromHost();
    tcpSocket->close();
и поток закрывается, связанный сигналом
  
Код:
 connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
Слот срабатывает, все отрабатывается.

Теперь если под виндой запустить netstat -a -o получаю вот такое

Имя     Локальный адрес      Внешний адрес          Состояние        PID
...
TCP         comp:6090           comp:6510            TIME_WAIT        0


и соединение будет еще висеть где-то 1,5 мин.

Сервер работает с разными клиентами и при обмене с каждым по несколько раз в секунду, такого рода процессы накапливаются и висят, пока не отваливаются где-то через 1.5 минуты.

Как сделать так чтобы этот процесс сразу же пропадал после завершения потока QThread?
« Последнее редактирование: Март 02, 2010, 17:25 от pawok11 » Записан
ilyagoo
Гость
« Ответ #1 : Февраль 05, 2010, 17:54 »

неа, нету такого Улыбающийся
и поток умирает, и сокет не висит. проверено.
« Последнее редактирование: Февраль 05, 2010, 18:02 от ilyagoo » Записан
k06a
Гость
« Ответ #2 : Февраль 07, 2010, 20:20 »

Ситуация достаточно интересная:
1) Объект QTcpSocket создавали не вы.
2) У объекта QTcpSocket стоит родитель - QTcpServer, который вам его(сокет) выдал
3) Деструктор объекта QTcpSocket вызовется и произойдёт освобождение памяти когда будете удалять объект QTcpServer.
4) Нельзя ни в коем случае делать delete socket; - если этот сокет создавали не вы.

Необходимо воспользоваться методом socket.deleteLater(); который удалит объект и освободит память в EventLoop-е приложения.
Записан
k06a
Гость
« Ответ #3 : Февраль 07, 2010, 20:22 »

Но, как и написал ilyagoo, такого быть не может и соединение должно закрываться через close().
Записан
BRE
Гость
« Ответ #4 : Февраль 07, 2010, 21:05 »

Сервер работает с разными клиентами и при обмене с каждым по несколько раз в секунду, такого рода процессы накапливаются и висят, пока не отваливаются где-то через 1.5 минуты.
Скорее всего не 1.5 минуты, а 2 (еще точнее 2MSL).
Все нормально, так и должно быть. Подробности кроются в работе TCP-стеке.
И уменьшать это время не стоит, т.к. могут начаться глюки с новыми сетевыми соединениями.
Записан
pawok11
Гость
« Ответ #5 : Февраль 08, 2010, 11:56 »

спасибо Улыбающийся

вот тут про это написано поподробнее
http://book.itep.ru/4/44/tcp_443.htm
« Последнее редактирование: Февраль 08, 2010, 12:28 от pawok11 » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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