Название: Сокеты, read write Отправлено: BuRn от Октябрь 19, 2014, 23:37 Добрый вечер, возникла проблема следующего рода:
Имеется клиент и сервер, которые общаются с помощью сокетов, клиент отсылает сервер принмает, обрабатывает и сливает результаты назад клиенту. Получить от клиента к серверу блока данных проблемы нет, но возникает проблема при получении обратного ответа от сервера. Сервер пишет в сокет : Код: request->getSocket()->write(data); Код: connect(_sock,SIGNAL(readyRead()),this,SLOT(onReadyRead())); Код: void ClientWc::onReadyRead() Код: if (tcpSocket->bytesAvailable() < m_nNextBlockSize) Название: Re: Сокеты, read write Отправлено: Old от Октябрь 20, 2014, 07:13 С тем, что пакет не обязательно приходит сразу и целиком.
У вас сработал сигнал readyRead, вы проверили сколько данных доступно для получения, если не все, то вышли из слота-отбработчика и ждете следующего сигнала readyRead. Название: Re: Сокеты, read write Отправлено: Bepec от Октябрь 20, 2014, 07:19 Обычно, во всяком случае в моей практике, пакет состоит из нескольких частей. Заголовок - последовательность байтов, которая показывает начало пакета. Далее следует длина пакета, потом тело и потом crc. CRC в принципе можно отбросить.
И приём сводится к приёму байт, проверке на заголовок и длину. Название: Re: Сокеты, read write Отправлено: BuRn от Октябрь 20, 2014, 18:48 С тем, что пакет не обязательно приходит сразу и целиком. Только вот следующий не срабатываетУ вас сработал сигнал readyRead, вы проверили сколько данных доступно для получения, если не все, то вышли из слота-отбработчика и ждете следующего сигнала readyRead. Название: Re: Сокеты, read write Отправлено: Old от Октябрь 20, 2014, 18:52 Только вот следующий не срабатывает Значит передается не корректный размер блока, который читается в m_nNextBlockSize.Либо отправляются не все данные, что по сути то же самое. Название: Re: Сокеты, read write Отправлено: Fregloin от Ноябрь 05, 2014, 11:32 ну еще попробуйте делать flush() для сокета
|