211 / 130 / 28
Регистрация: 20.03.2009
Сообщений: 1,123
Записей в блоге: 16
1

Правильный дисконнект QTcpSocket

04.09.2012, 15:00. Показов 2781. Ответов 4
Метки нет (Все метки)

Доброго времени суток!

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

Соответственно, имеется два указателя - на QTcpServer и QTcpSocket, общение в обоих режимах происходит через сокет. Имеется возможность в любой момент времени в любом из режимов произвести дисконнект (нажав на кнопку).

Собственно, хотелось бы узнать, как это лучше всего сделать. Есть вариант по нажатию кнопки для сокета вызывать disconnectFromHost, при получении сигнала сокета disconnected вызывать для сокета deleteLater (а если приложение работает в режиме сервера, то заодно вызывать close для сервера). И все вроде бы в этом варианте хорошо, только disconnectFromHost никак не может дойти до высылки сигнала disconnected - очевидно, никак не может закончить прием данных. Видимо, закавыка именно в нем.

Привожу код (а-ля Шлее):
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void MyChat::slotReadMessage()
    {
    QDataStream in(Socket);
    in.setVersion(QDataStream::Qt_4_6);
    while(true)
        {
        if (NextBlockSize == 0)
            {
            if (Socket -> bytesAvailable() < sizeof(quint16))
                break;
            in >> NextBlockSize;
            }
        if (Socket -> bytesAvailable() < NextBlockSize)
            break;
        QTime time;
        QString str;
        in >> time >> str;
 
        EdtChatText -> append(str);
 
        NextBlockSize = 0;
        }
    }
Таким образом, у меня два вопроса:
1. Правильная ли моя идея дисконнекта (с учетом двух режимов работы приложения), и не упустил ли я чего-то?
2. Правильно ли я грешу на слот чтения сообщения, и если да, то как его исправить до рабочего состояния?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.09.2012, 15:00
Ответы с готовыми решениями:

Дисконнект в QTcpSocket
В QTcpServer к сигналу connected() прикреплен следующий слот: void Widget::newUserConnect(){ ...

Дисконнект с эмулятором
В таком варианте работает, но должно быть то, что в комментариях сейчас если это все...

Дисконнект к серверу
Народ! помогите решить проблему. ситуация такая: захожу на сайт, где размещено приложение,...

дисконнект на каждой 7 минуте.
Вообщем к WIFI модему Cisco подключено 2 компа... 1 по витухе второй по вайфаю... С некоторых пор...

4
211 / 130 / 28
Регистрация: 20.03.2009
Сообщений: 1,123
Записей в блоге: 16
05.09.2012, 22:05  [ТС] 2
Проблема все еще актуальна.
0
Эксперт С++
1933 / 1045 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
05.09.2012, 22:51 3
все верно, банального вызова disconnectFromHost и deleteLeater более чем достаточно (правда я не уверен, на счет close для сервера...) а если не дисконнектит, ищите у себя или бесконечный цикл или проблемы с мьютексом....
1
211 / 130 / 28
Регистрация: 20.03.2009
Сообщений: 1,123
Записей в блоге: 16
06.09.2012, 17:22  [ТС] 4
l_a_m, спасибо, будем искать! Я где-то в сети видел упоминание, мол, у Шлее тут косяк какой-то с лишним break ("читайте лучше Бланшет"), но пока до конца с этим не разобрался.
Для сервера, насколько я понимаю, при закрытии close, при новом создании - listen.
0
136 / 140 / 7
Регистрация: 22.08.2011
Сообщений: 484
07.09.2012, 16:12 5
Есть ешЁ возможность обрабатывать ошибки...
Так вот, иногда после SocketError может наступить дисконкт, а может и нет.
Тут нужно обрабатывать что-то одно. Вообще "Правильный дисконект" может
освобождать порт почти сразу, а вот по ошибке - тогда ждать под 90-100 сек.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.09.2012, 16:12

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Поймать дисконнект клиента
можно ли на сервере как то отловить то что клиент отсоединился? кроме как передавать постоянно...

Постоянный дисконнект от Wi-Fi сети в Ubuntu
Приветствую. Временно поселился в кампусе. На весь кампус одна вай-фай точка, а может она одна и...

Как правильно делать дисконнект базы?
если я делаю коннект в одном asp файле, а дисконнект в другом то достаточно будет строчек...

Boost::asio как обнаружить дисконнект на удалённой машине?
В данный момент обрабатываю дисконнекты, глядя на возвращаемые коды ошибок после вызовов...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.