Russian Qt Forum

Qt => Работа с сетью => Тема начата: Vladimir от Сентябрь 05, 2011, 11:10



Название: Чтение из сокета
Отправлено: Vladimir от Сентябрь 05, 2011, 11:10
Добрый день! Такой вопрос..
Есть структура одна и та же у клиента и у сервера
Код:
struct headl
{
   quint32 sizeDate;
   quint32 titMsg;
   QString nameFile;
}
Ее передаю по сети..
Сервер
Код:
QByteArray arrBlock;
headl objHead;
objHead.sizeDate = 10;
objHead.titMsg = 1;
objHead.nameFile = "Hello";

arrBlock.append((const char*)&objHead,sizeof(objHead));
m_pTcpSocket->write(arrBlock);

Киент
Принимаю структуру..
Код:
tcpSocet->read((char*)&objHead,sizeof(objHead));
В полях..
objHead.sizeDate = 10;
objHead.titMsg = 1;
все передано корректно..

а вот в objHead.nameFile = 0х00ad1fd0;

ПОЧЕМУ??????


Название: Re: Чтение из сокета
Отправлено: Пантер от Сентябрь 05, 2011, 11:12
Потому что так нельзя делать. Используй QDataStream.


Название: Re: Чтение из сокета
Отправлено: ddrtn от Сентябрь 05, 2011, 11:12
QString не является POD типом. для передачи в сокет поля структуры лучше серилизовать. если же передавать структуру бинаро, то вместо QString нужно пользоваться char[] с постоянным размером.


Название: Re: Чтение из сокета
Отправлено: Vladimir от Сентябрь 05, 2011, 11:15
Потому что так нельзя делать. Используй QDataStream.

QString без QDataStream не передашь что ли? Мне нужно сделать методами read()/write().. без QDataStream..


Название: Re: Чтение из сокета
Отправлено: Пантер от Сентябрь 05, 2011, 11:21
При помощи QDataStream все записываешь в QByteArray, который уже и передаешь.


Название: Re: Чтение из сокета
Отправлено: Vladimir от Сентябрь 05, 2011, 11:29
При помощи QDataStream все записываешь в QByteArray, который уже и передаешь.

ты не обратил внимание.. я и передаю QByteArray! Для этого не обязательно использовать QDataStream


Название: Re: Чтение из сокета
Отправлено: LisandreL от Сентябрь 05, 2011, 11:36
ты не обратил внимание.. я и передаю QByteArray! Для этого не обязательно использовать QDataStream
Необязательно, но так как вы записываете делать нельзя.
Если упрощённо объяснить, то QString внутри содержит указатель (адрес в памяти) и вместо текста вы передаёте его. В клиенте этот указатель ссылает фактически в никуда.


Название: Re: Чтение из сокета
Отправлено: Пантер от Сентябрь 05, 2011, 11:39
Вообще, не используй такой сишный каст структуры к чему-то другому и обратно. Используй сериализацию.


Название: Re: Чтение из сокета
Отправлено: Vladimir от Сентябрь 05, 2011, 15:37
И все же как конкретно передать текстовое сообщение, если не QString..?
Объявить в структуре как вариант char name[1024]; и передавать таким образом?
Тогда попутно еще вопросик почему при конвертации из QString в char в конце добавляется мусор?

Код:
QString wayFile;
objHead.name[i] = wayFile.at(i).toAscii();
 
:-\
 



Название: Re: Чтение из сокета
Отправлено: Рома от Сентябрь 05, 2011, 16:24
Попробуйте так
Код
C++ (Qt)
QByterray arr;
QDateStream stream(&arr);
stream << objHead.sizeDAte << objHead.titMsg << objHead.nameFile;
m_pTcpSocket->write(arr);

Код
QDataStream stream(tcpSocet);
stream >> objHead.sizeDate >> objHead.titMsg >> objHead.nameFile;
 

Думаю, так должно сработать.


Название: Re: Чтение из сокета
Отправлено: Vladimir от Сентябрь 05, 2011, 17:28
Попробуйте так
Код
C++ (Qt)
QByterray arr;
QDateStream stream(&arr);
stream << objHead.sizeDAte << objHead.titMsg << objHead.nameFile;
m_pTcpSocket->write(arr);

Код
QDataStream stream(tcpSocet);
stream >> objHead.sizeDate >> objHead.titMsg >> objHead.nameFile;
 

Думаю, так должно сработать.


Да скорее всего и будет, но мне нужно без QDateStream!
Понял почему дописывает левые символы - всё дело в структуре!
имя записанное в objHead.name должно быть меньше 32 символов! Следовательно вопрос:
что нужно сделать чтобы можно было передавать имена больше 32 символов?

Код:
struct headl
{
   quint32 sizeDate;
   quint32 titMsg;
   char name[1024];
}


Название: Re: Чтение из сокета
Отправлено: asvil от Сентябрь 05, 2011, 17:31
А почему вам не нужно QDataStream?


Название: Re: Чтение из сокета
Отправлено: Vladimir от Сентябрь 05, 2011, 17:39
А почему вам не нужно QDataStream?

Задание на работе такое дали  :) сделать без QDataStream методами read()/write()!


Название: Re: Чтение из сокета
Отправлено: BRE от Сентябрь 05, 2011, 17:54
Vladimir, ты сейчас занес микроскоп над гвоздем и пытаешься всем объяснить, что молоток тебе не нужен. ;)
На самом деле в теме передачи структуры по сети очень много подводных камней. Это и выравнивание полей структуры и разный порядок хранения + необходимость перевода чисел в сетевой порядок. Опять же отправка объектов (тег же строк).
QDataStream как раз и решает все эти проблемы.

Понял почему дописывает левые символы - всё дело в структуре!
Нет, все дело в том, что так:
Код:
QString wayFile;
objHead.name[i] = wayFile.at(i).toAscii();
 
с C-строками работать нельзя. Почитай про strcpy, strcmp, str* группу функций.

Задание на работе такое дали  :) сделать без QDataStream методами read()/write()!
Тогда читать про все описанное выше: выравнивание полей структур, порядок байт (что-то я возможно еще упустил) и бороть самому. Исходники QDataStream в этом здорово помогут. :)


Название: Re: Чтение из сокета
Отправлено: Vladimir от Сентябрь 05, 2011, 23:55
Vladimir, ты сейчас занес микроскоп над гвоздем и пытаешься всем объяснить, что молоток тебе не нужен. ;)
На самом деле в теме передачи структуры по сети очень много подводных камней. Это и выравнивание полей структуры и разный порядок хранения + необходимость перевода чисел в сетевой порядок. Опять же отправка объектов (тег же строк).
QDataStream как раз и решает все эти проблемы.

Понял почему дописывает левые символы - всё дело в структуре!
Нет, все дело в том, что так:
Код:
QString wayFile;


objHead.name[i] = wayFile.at(i).toAscii();
 
с C-строками работать нельзя. Почитай про strcpy, strcmp, str* группу функций.

Задание на работе такое дали  :) сделать без QDataStream методами read()/write()!
Тогда читать про все описанное выше: выравнивание полей структур, порядок байт (что-то я возможно еще упустил) и бороть самому. Исходники QDataStream в этом здорово помогут. :)


"Vladimir, ты сейчас занес микроскоп над гвоздем и пытаешься всем объяснить, что молоток тебе не нужен."
шикарно =)) про strcpy, strcmp в курсе - учту!

"выравнивание полей структур" я и пытался сделать.. ну что-то безуспешно, либо читает с именем больше 32 символов, а меньше нет, либо наоборот..Значит, исходники QDataStream, а в книженциях каких это можно глянуть?!