Russian Qt Forum
Сентябрь 30, 2024, 12:36 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTcpSocket - НИ ЕДИНОГО РАЗРЫВА!!! :-)  (Прочитано 6114 раз)
l_a_m
Гость
« : Апрель 21, 2010, 11:42 »

Доброе время суток ув. Коллеги!
суть вопроса следующая: разрабатываю клиент-серверное приложение, требуется сделать приложение смешанного типа (как принимать запросы и выдавать ответы, так и генерировать свои запросы при некоторых условиях). Данные должны течь используя TCP протокол. Пока-что хотелось бы реализовать банальный сервер: ставлю сервер на прослушивание, получаю новое соединение, прослушиваю запрос - выдаю ответ, прослушиваю запрос - выдаю ответ и т.д. (соединение не рвём). Пока получается сделать следующее: ставлю сервер на прослушивание, получаю новое соединение, прослушиваю запрос - выдаю ответ, рву соединение (если этого не сделать - ответ не отсылается, по какой-то неведанной мне причине). может быть кто сталкивался с такой проблемой, где тут собака зарыта? :-)

зы: Qt Version 4.6.2, ОС(сервера разрабатываемого мной) - Windows ХР(возможны варианты кроссплатформенности), клиент - любая ОС, в том числа внешнее устройство с жестко закодированной логикой.

я сейчас делаю примерно так:
Код:
void myServer::newConnectionBegin()
{
QTcpSocket *clientConnection = this->serv.nextPendingConnection();
QByteArray readedByts;

if(clientConnection->waitForReadyRead(-1))
{
readedByts = clientConnection->read(requests.getMaximumSizeOfCommands());
std::cout<<"Request is:\t";
for (int i=0;i<readedByts.size();i++)
{
printf("%02X ", readedByts.at(i));
}
std::cout<<std::endl;
}

QByteArray responseCommand = GenerateResponse(readedByts);
if(responseCommand.size() >0 )
{
clientConnection->write(responseCommand);
std::cout<<"Response is:\t";
for(int i =0;i<responseCommand.size();i++)
{
printf("%02X ", responseCommand.at(i));
}
std::cout<<std::endl;
}
else
{
std::cout<<"Response is:\tUNKNOW_REQUEST"<<std::endl;
}
clientConnection->disconnectFromHost();
}
в конструкторе делаю коннект:
Код:
connect(&serv, SIGNAL(newConnection()), this, SLOT(newConnectionBegin()));
« Последнее редактирование: Апрель 21, 2010, 11:44 от l_a_m » Записан
BRE
Гость
« Ответ #1 : Апрель 21, 2010, 12:10 »

Попробуй после write делать flush.
Записан
l_a_m
Гость
« Ответ #2 : Апрель 21, 2010, 12:14 »

Попробуй после write делать flush.
пробовал - не помогает, какие ещё варианты могут быть? :-)
Записан
ilyagoo
Гость
« Ответ #3 : Апрель 21, 2010, 12:44 »

BRE прав.
смотри как ты отправляешь и получаешь данные, целиком ли? прилепи к данным заголовок с размером и жди, пока не плучишь сообщение полностью.
Записан
l_a_m
Гость
« Ответ #4 : Апрель 21, 2010, 13:00 »

BRE прав.
смотри как ты отправляешь и получаешь данные, целиком ли? прилепи к данным заголовок с размером и жди, пока не плучишь сообщение полностью.
Данные в принципе не отправляются, если не делать дисконнект. (слушал и снифером и писал клиента, результат один - не работает Грустный)
Записан
BRE
Гость
« Ответ #5 : Апрель 21, 2010, 13:05 »

Отправка данных происходит асинхронно, при возврате в цикл обработки событий, write только сохраняет данные во внутренние буферы.
flush должен принудительно вытолкнуть их в сокет, почему у тебя это не происходит... вопрос?

Если хочется синхронной работы, попробуй после write дождаться реальной отправки данных:
смотри bool QIODevice::waitForBytesWritten ( int msecs )   [virtual]
« Последнее редактирование: Апрель 21, 2010, 13:10 от BRE » Записан
l_a_m
Гость
« Ответ #6 : Апрель 21, 2010, 13:18 »

Отправка данных происходит асинхронно, при возврате в цикл обработки событий, write только сохраняет данные во внутренние буферы.
flush должен принудительно вытолкнуть их в сокет, почему у тебя это не происходит... вопрос?

Если хочется синхронной работы, попробуй после write дождаться реальной отправки данных:
смотри bool QIODevice::waitForBytesWritten ( int msecs )   [virtual]

к синхронности не стремлюсь... а вот по поводу принудительного вбрасывания в сокет - это я уже читал, но вот он гад не выплёвывает нефига :-( почему, понять не могу... данные из буфера принудительно выплёвываются в сокет в 2-х случаях (если я не ошибаюсь), это при вызове flush и при разрыве соединения, при разрыве соединения - всё в норме, данные текут, а вот при вызове flush - почему-то нефига не идёт :-(
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.041 секунд. Запросов: 21.