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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сокеты, read write  (Прочитано 3388 раз)
BuRn
Гость
« : Октябрь 19, 2014, 23:37 »

Добрый вечер, возникла проблема следующего рода:
Имеется клиент и сервер, которые общаются с помощью сокетов, клиент отсылает сервер принмает, обрабатывает и сливает результаты назад клиенту. Получить от клиента к серверу блока данных проблемы нет, но возникает проблема при получении обратного ответа от сервера. Сервер пишет в сокет :
Код:
request->getSocket()->write(data);
На этот момент data != "", тут же на стороне клиента срабатывает слот:
Код:
connect(_sock,SIGNAL(readyRead()),this,SLOT(onReadyRead()));
Пытаюсь прочитать блок данных так:
Код:
void ClientWc::onReadyRead()
{
    QTcpSocket *tcpSocket = (QTcpSocket*)sender();
    QDataStream in(tcpSocket);
    for (;;)
    {
         if (!m_nNextBlockSize)
         {
             if (tcpSocket->bytesAvailable() < sizeof(quint16))
                 break;
             in >> m_nNextBlockSize;
         }
         if (tcpSocket->bytesAvailable() < m_nNextBlockSize)
             break;
         QByteArray receiveData;
         in>>receiveData;
         QByteArray key = _sockets.key(tcpSocket);
         _sockets.remove(key);
         delete tcpSocket;
         emit received(key,receiveData);
         m_nNextBlockSize = 0;
     }
}
и обламываюсь на
Код:
if (tcpSocket->bytesAvailable() < m_nNextBlockSize)
Первое возвращает 1, по непонятным мне причинам, может кто подскажет с чем может быть связано?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #1 : Октябрь 20, 2014, 07:13 »

С тем, что пакет не обязательно приходит сразу и целиком.
У вас сработал сигнал readyRead, вы проверили сколько данных доступно для получения, если не все, то вышли из слота-отбработчика и ждете следующего сигнала readyRead.
Записан
Bepec
Гость
« Ответ #2 : Октябрь 20, 2014, 07:19 »

Обычно, во всяком случае в моей практике, пакет состоит из нескольких частей. Заголовок - последовательность байтов, которая показывает начало пакета. Далее следует длина пакета, потом тело и потом crc. CRC в принципе можно отбросить.
И приём сводится к приёму байт, проверке на заголовок и длину.
Записан
BuRn
Гость
« Ответ #3 : Октябрь 20, 2014, 18:48 »

С тем, что пакет не обязательно приходит сразу и целиком.
У вас сработал сигнал readyRead, вы проверили сколько данных доступно для получения, если не все, то вышли из слота-отбработчика и ждете следующего сигнала readyRead.

Только вот следующий не срабатывает
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #4 : Октябрь 20, 2014, 18:52 »

Только вот следующий не срабатывает
Значит передается не корректный размер блока, который читается в m_nNextBlockSize.
Либо отправляются не все данные, что по сути то же самое.
« Последнее редактирование: Октябрь 20, 2014, 18:55 от Old » Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #5 : Ноябрь 05, 2014, 11:32 »

ну еще попробуйте делать flush() для сокета
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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