1 | ||||||
Правильный дисконнект QTcpSocket04.09.2012, 15:00. Показов 3331. Ответов 4
Метки нет (Все метки)
Доброго времени суток!
Ситуация такова: имеется приложение, реализующее простой чат, причем приложение может работать как клиентом, так и сервером (предполагается, что клиент может подключиться только один, так что после того, как клиент подключится к серверу, разницы в поведении приложений практически нет). Соответственно, имеется два указателя - на QTcpServer и QTcpSocket, общение в обоих режимах происходит через сокет. Имеется возможность в любой момент времени в любом из режимов произвести дисконнект (нажав на кнопку). Собственно, хотелось бы узнать, как это лучше всего сделать. Есть вариант по нажатию кнопки для сокета вызывать disconnectFromHost, при получении сигнала сокета disconnected вызывать для сокета deleteLater (а если приложение работает в режиме сервера, то заодно вызывать close для сервера). И все вроде бы в этом варианте хорошо, только disconnectFromHost никак не может дойти до высылки сигнала disconnected - очевидно, никак не может закончить прием данных. Видимо, закавыка именно в нем. Привожу код (а-ля Шлее):
1. Правильная ли моя идея дисконнекта (с учетом двух режимов работы приложения), и не упустил ли я чего-то? 2. Правильно ли я грешу на слот чтения сообщения, и если да, то как его исправить до рабочего состояния?
0
|
04.09.2012, 15:00 | |
Ответы с готовыми решениями:
4
Дисконнект в QTcpSocket Дисконнект с эмулятором Дисконнект к серверу дисконнект на каждой 7 минуте. |
1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
|
|
05.09.2012, 22:51 | 3 |
все верно, банального вызова disconnectFromHost и deleteLeater более чем достаточно (правда я не уверен, на счет close для сервера...) а если не дисконнектит, ищите у себя или бесконечный цикл или проблемы с мьютексом....
1
|
06.09.2012, 17:22 [ТС] | 4 |
l_a_m, спасибо, будем искать! Я где-то в сети видел упоминание, мол, у Шлее тут косяк какой-то с лишним break ("читайте лучше Бланшет"), но пока до конца с этим не разобрался.
Для сервера, насколько я понимаю, при закрытии close, при новом создании - listen.
0
|
136 / 140 / 7
Регистрация: 22.08.2011
Сообщений: 485
|
|
07.09.2012, 16:12 | 5 |
Есть ешЁ возможность обрабатывать ошибки...
Так вот, иногда после SocketError может наступить дисконкт, а может и нет. Тут нужно обрабатывать что-то одно. Вообще "Правильный дисконект" может освобождать порт почти сразу, а вот по ошибке - тогда ждать под 90-100 сек.
0
|
07.09.2012, 16:12 | |
07.09.2012, 16:12 | |
Помогаю со студенческими работами здесь
5
Поймать дисконнект клиента Постоянный дисконнект от Wi-Fi сети в Ubuntu Как правильно делать дисконнект базы? Boost::asio как обнаружить дисконнект на удалённой машине? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |