LINUX.ORG.RU

TCP-сервер отдаёт только 3 байта

 , ,


0

1

Сабж. Есть клиент и сервер, оба на qt. Во время авторизации клиент синхронно коннектится (успешно), синхронно передаёт данные длиной 32 байта (успешно) и так-же синхронно ждёт ответа.
Сервер успешно клиента коннектит, переданные данные парсит и отдаёт ответ размером 5 байт.

2 байта - размер данных (unsigned short int)
2 байта - опкод (unsigned short int)
1 байт - булевое значение

Вся проблема в том, что из этих 5 байт приходят только 3, сколько долго бы я не ждал. Если отправлять больше - всё-равно только 3 байта. Трафик парсил, с сервера отсылается только 1 пакет с данными. Куда копать?

	QByteArray authAnsewer;
	QDataStream out(&authAnsewer, QIODevice::WriteOnly);
	out.setVersion(QDataStream::Qt_4_8);

	out << (opcode)op_auth_ans << true;

	send(&authAnsewer);
void Player::send(QByteArray *data)
{
	QByteArray sendedData;

	QDataStream out(&sendedData, QIODevice::WriteOnly);
	out.setVersion(QDataStream::Qt_4_8);

	tcp_size size = (tcp_size)data->size();
	out << size << data;

	qDebug() << "size: " << size;

	socket->write(sendedData);
}
★★

Последнее исправление: Dragon59 (всего исправлений: 4)

ИЧСХ, если добавить после send(&authAnsewer);

socket->waitForBytesWritten();
qDebug() << "All data sended";

Дебаг отработает моментально, т.е все данные тут-же пишутся в девайс.

Dragon59 ★★
() автор топика
Ответ на: комментарий от Dragon59

Освежил инфу в голове, и правда размер пишется за вычетом этих двух байт. Может таки снифнуть пакет на выходе и на входе. Вдруг не тут проблема.

erfea ★★★★★
()
Ответ на: комментарий от erfea

Может таки снифнуть пакет на выходе и на входе. Вдруг не тут проблема.

На выходе пакет из 3 байт.

00 03 01
00 03 - размер. 01 - хзчеваще, тут должен быть первый байт опкода. т.е 00.

Dragon59 ★★
() автор топика

Во-первых socket->flush()

Во-вторых, почему вы не проверяете результат socket->write()? Вам ведь интересно сколько байт отправляется, так?

no-such-file ★★★★★
()
Ответ на: комментарий от Dragon59

Много букв пишет. Не осилил.

Странно, сниффер осилил, а такой полезный в данной ситуации strace не осилил. Ну ладно.

Хотя я и не эксперт по C++, но смею предположить, что конструкция вида out << size << data, где data — указатель на объект класса QByteArray, запишет в out не содержимое объекта QByteArray, а в лучшем случае его адрес. Или даже что-то вроде (bool)data.

Deleted
()
Ответ на: комментарий от no-such-file

Во-первых socket->flush()

Во-вторых, почему вы не проверяете результат socket->write()? Вам ведь интересно сколько байт отправляется, так?

Выше на оба пункта ответил же.

Dragon59 ★★
() автор топика
Ответ на: комментарий от no-such-file

А event loop у вас работает?

Работает.

Dragon59 ★★
() автор топика
Ответ на: комментарий от no-such-file

Во-вторых, почему вы не проверяете результат socket->write()? Вам ведь интересно сколько байт отправляется, так?

Прошу прощения, не сразу понял. Сейчас проверил, write() возвращает 3. И размер отправляемого QByteArray'я 3. Спасибо, я понял в чём ошибка. Но ещё не понял где :)

Dragon59 ★★
() автор топика
Ответ на: sended от mv

sent, да.

Dragon59 ★★
() автор топика
Ответ на: комментарий от Deleted

конструкция вида out << size << data, где data — указатель на объект класса QByteArray, запишет в out не содержимое объекта QByteArray, а в лучшем случае его адрес. Или даже что-то вроде (bool)data.

Абсолютно верно, спасибо больше. Раз 10 же код просматривал, а заметил только сейчас.

Dragon59 ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.