Название: [Решено] Завершение соединения между клиентом и сервером. Соединение висит 2 мин Отправлено: pawok11 от Февраль 05, 2010, 15:42 Запущен QTcpServer. На каждое входящее сообщение запускается свой поток обработки QThread, в котором вызывается QTcpSocket. После окончания обмена данными QTcpSocket закрывается
Код: tcpSocket->disconnectFromHost(); Код: 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) |