Название: При передаче через QUdpSocket первый байт неправильный Отправлено: vulko от Апрель 23, 2014, 10:25 Столкнулся с такой проблемой, передаю данные через udp socket... точнее переделал передачу с tcp на udp.
При десериализации данных заметил кривые данные. Дебаг помог выяснить что первый байт после десериализации неверный. В нём почему-то лежит 48 в char эквиваленте. Можно было бы конечно первый байт забить какой-нибудь ненужной информацией... но все таки я не сторонник индусского багфикса. Хотелось бы понять причину. Код: typedef unsigned int uint; Ну и прием: Код: qDebug() << "socket data recieved: " << pUdpSocket->size() << " bytes"; В итоге если смотреть непосредственно QByteArray'и при отправке и при получении, то они отличаются первым байтом. В нём лежит char со значением 48, вместо нуля... Возможно я что-то делаю не так? п.с. qt 4.8.3 Название: Re: При передаче через QUdpSocket первый байт неправильный Отправлено: OKTA от Апрель 23, 2014, 10:37 48 Символ ASCII таблицы это и есть ноль вообще-то ;D
Название: Re: При передаче через QUdpSocket первый байт неправильный Отправлено: vulko от Апрель 23, 2014, 11:18 48 Символ ASCII таблицы это и есть ноль вообще-то ;D смешно канеш, но остальные то не 48, а нули, как и положено после memset'а. в коде memset на 1ку стоит, а так вообще я на нуле тестил сперва. занулял всю структуру. писал в поток ID = 1. QByteArray состоял нулей. Записанный инт выглядел как 3 нулевых байта и 1 байт единичка. После передачи у меня в QByteArray лежит не 3 нуля + 1 единица, а 48, два нуля и единица. Название: Re: При передаче через QUdpSocket первый байт неправильный Отправлено: OKTA от Апрель 23, 2014, 11:47 Дал бы тестовый проект - интересно попробовать!
Название: Re: При передаче через QUdpSocket первый байт неправильный Отправлено: vulko от Апрель 23, 2014, 14:08 Дал бы тестовый проект - интересно попробовать! тестового нет. занятно, заменил Код: QByteArray *datagram = new QByteArray(pUdpSocket->pendingDatagramSize(), '0'); на Код: QByteArray socketData; и заработало. однако мусорные значения все ещё прилетают, но теперь хотя бы есть и правильные... как писал ещё Пушкин... "умом QT мне не понять..." тот же самый код, тока QByteArray теперь на стэке живет а не в куче... что за хрень... Название: Re: При передаче через QUdpSocket первый байт неправильный Отправлено: OKTA от Апрель 23, 2014, 14:22 Код: QByteArray *datagram = new QByteArray(pUdpSocket->pendingDatagramSize(), '0'); Поставь просто Код: QByteArray *datagram = new QByteArray(pUdpSocket->pendingDatagramSize(), 0); Название: Re: При передаче через QUdpSocket первый байт неправильный Отправлено: vulko от Апрель 23, 2014, 15:05 Код: QByteArray *datagram = new QByteArray(pUdpSocket->pendingDatagramSize(), '0'); Поставь просто Код: QByteArray *datagram = new QByteArray(pUdpSocket->pendingDatagramSize(), 0); короче убрал я этот код, как и писал, заменил на другой. добавил также movetothread(this) в конструктор класса который работает с сокетом и наследуется от qthread, чтобы все слоты также вызывались в отдельном потоке. вообще все это movetothread это отдельная сказка... я уже оценил тупость архитекторов QT... ну да ладно, не о них речь. теперь проблема другая на горизонте. каждый раз после моего пакета прилетает мне ещё один пакет с небольшим размером и с магическими цифрами... в виде float'а. Код: socket data recieved: 1 bytes datagramm: 1 что это за хрень, я без понятия... идея работы у меня такая - я шлю на сервер float, он мне отвечает структурой. соотв у меня есть класс в клиенте где есть qupdsocket. чтобы readyRead срабатывал на пакеты на определенный порт, я делаю на клиенте pUdpSocket->bind(ipAddress, 54002); серверу я шлю данные постоянно (в data лежит float) pUdpSocket->writeDatagram(data, ipAddress, 54001); а у сервера соотв. привзяка к своему порту: pSrvUdpSocket->bind(ipAddress, 54001); когда сервер получает пакет с float'ом, он отвечает пакетом с сериализованной структурой. но блин у меня каждый пакет со структурой сопровождается пакетом с float'ом на клиенте, хотя сервер его не слал! что за полтергейст... причем я добавил логирование и это другие float'ы... откуда они?! что это за пакеты вообще блин!!! я уже задрался с кривостями QT. брошу все нах буду на жабе писать лучше...) Код: sent 0 Название: Re: При передаче через QUdpSocket первый байт неправильный Отправлено: Old от Апрель 23, 2014, 15:15 я уже задрался с кривостями QT. Вместе с Qt идут примеры, там есть две маленьких программки broadcastsender и broadcastreceiver. Соберите их и проверьте, будут ли они у вас работать? Если будут, то не нужно здесь поливать Qt, а нужно учить язык и сам фреймфорк. C++ не прощает ошибок, это не жаба. Ошиблись чуть и будет падать и тупить.брошу все нах буду на жабе писать лучше...) Вы нас так не пугайте.Название: Re: При передаче через QUdpSocket первый байт неправильный Отправлено: vulko от Апрель 23, 2014, 15:46 я уже задрался с кривостями QT. Вместе с Qt идут примеры, там есть две маленьких программки broadcastsender и broadcastreceiver. Соберите их и проверьте, будут ли они у вас работать? Если будут, то не нужно здесь поливать Qt, а нужно учить язык и сам фреймфорк. C++ не прощает ошибок, это не жаба. Ошиблись чуть и будет падать и тупить.брошу все нах буду на жабе писать лучше...) Вы нас так не пугайте.Примеры это все хорошо, но как всегда от реальности они далеко. Во-первых, в этих примерах используется мультикаст, а, во-вторых... а во-вторых, как обычно примеры слишком примитивны что-бы ответить на многие вопросы. Название: Re: При передаче через QUdpSocket первый байт неправильный Отправлено: Old от Апрель 23, 2014, 15:50 Примеры это все хорошо, но как всегда от реальности они далеко. Во-первых, в этих примерах используется мультикаст, а, во-вторых... а во-вторых, как обычно примеры слишком примитивны что-бы ответить на многие вопросы. Они доказывают главное: виноват не Qt, а руки.И пока вы в этом не признаетесь самому себе, ничего получаться не будет. ;) Вы думаете вы первый у кого что-то не работает и он винит в этом компилятор, Qt, QtCreator, компьютер.... Поищите по форуму их тысячи, но как правило всегда оказывалось, что виноваты авторы, а не инструменты. :) Название: Re: При передаче через QUdpSocket первый байт неправильный Отправлено: OKTA от Апрель 23, 2014, 16:15 Уже кстати давно надо банить за QT ;D
|