Russian Qt Forum

Qt => Работа с сетью => Тема начата: pawok11 от Февраль 05, 2010, 15:42



Название: [Решено] Завершение соединения между клиентом и сервером. Соединение висит 2 мин
Отправлено: 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?


Название: Re: Завершение соединения между клиентом и сервером
Отправлено: ilyagoo от Февраль 05, 2010, 17:54
неа, нету такого :)
и поток умирает, и сокет не висит. проверено.


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

Необходимо воспользоваться методом socket.deleteLater(); который удалит объект и освободит память в EventLoop-е приложения.


Название: Re: Завершение соединения между клиентом и сервером
Отправлено: k06a от Февраль 07, 2010, 20:22
Но, как и написал ilyagoo, такого быть не может и соединение должно закрываться через close().


Название: Re: Завершение соединения между клиентом и сервером
Отправлено: BRE от Февраль 07, 2010, 21:05
Сервер работает с разными клиентами и при обмене с каждым по несколько раз в секунду, такого рода процессы накапливаются и висят, пока не отваливаются где-то через 1.5 минуты.
Скорее всего не 1.5 минуты, а 2 (еще точнее 2MSL).
Все нормально, так и должно быть. Подробности кроются в работе TCP-стеке.
И уменьшать это время не стоит, т.к. могут начаться глюки с новыми сетевыми соединениями.


Название: Re: Завершение соединения между клиентом и сервером
Отправлено: pawok11 от Февраль 08, 2010, 11:56
спасибо :)

вот тут про это написано поподробнее
http://book.itep.ru/4/44/tcp_443.htm (http://book.itep.ru/4/44/tcp_443.htm)