Russian Qt Forum

Qt => Работа с сетью => Тема начата: l_a_m от Апрель 21, 2010, 11:42



Название: QTcpSocket - НИ ЕДИНОГО РАЗРЫВА!!! :-)
Отправлено: 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()));


Название: Re: QTcpSocket - НИ ЕДИНОГО РАЗРЫВА!!! :-)
Отправлено: BRE от Апрель 21, 2010, 12:10
Попробуй после write делать flush.


Название: Re: QTcpSocket - НИ ЕДИНОГО РАЗРЫВА!!! :-)
Отправлено: l_a_m от Апрель 21, 2010, 12:14
Попробуй после write делать flush.
пробовал - не помогает, какие ещё варианты могут быть? :-)


Название: Re: QTcpSocket - НИ ЕДИНОГО РАЗРЫВА!!! :-)
Отправлено: ilyagoo от Апрель 21, 2010, 12:44
BRE прав.
смотри как ты отправляешь и получаешь данные, целиком ли? прилепи к данным заголовок с размером и жди, пока не плучишь сообщение полностью.


Название: Re: QTcpSocket - НИ ЕДИНОГО РАЗРЫВА!!! :-)
Отправлено: l_a_m от Апрель 21, 2010, 13:00
BRE прав.
смотри как ты отправляешь и получаешь данные, целиком ли? прилепи к данным заголовок с размером и жди, пока не плучишь сообщение полностью.
Данные в принципе не отправляются, если не делать дисконнект. (слушал и снифером и писал клиента, результат один - не работает :()


Название: Re: QTcpSocket - НИ ЕДИНОГО РАЗРЫВА!!! :-)
Отправлено: BRE от Апрель 21, 2010, 13:05
Отправка данных происходит асинхронно, при возврате в цикл обработки событий, write только сохраняет данные во внутренние буферы.
flush должен принудительно вытолкнуть их в сокет, почему у тебя это не происходит... вопрос?

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


Название: Re: QTcpSocket - НИ ЕДИНОГО РАЗРЫВА!!! :-)
Отправлено: l_a_m от Апрель 21, 2010, 13:18
Отправка данных происходит асинхронно, при возврате в цикл обработки событий, write только сохраняет данные во внутренние буферы.
flush должен принудительно вытолкнуть их в сокет, почему у тебя это не происходит... вопрос?

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

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