Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.08.2012, 23:46   #1
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию Правильный дисконнект QTcpSocket

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

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

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

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

Привожу код (а-ля Шлее):
Код:
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. Правильно ли я грешу на слот чтения сообщения, и если да, то как его исправить до рабочего состояния?
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 02.09.2012, 21:43   #2
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Проблема не потеряла своей актуальности.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
QTcpSocket получить данный от cisco с 22 порта _KUL Qt и кроссплатформенное программирование С/С++ 6 13.07.2012 11:19
Правильный треугольник St1nk3r Помощь студентам 12 05.11.2011 10:36
правильный алгоритм? Pekus Помощь студентам 2 19.05.2011 12:26
Правильный антивирус. the_deer_one Свободное общение 4 25.06.2010 11:32
Правильный ли код? anomals PHP 4 10.02.2010 14:06