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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Чтение из сокета  (Прочитано 9481 раз)
Vladimir
Крякер
****
Offline Offline

Сообщений: 305



Просмотр профиля
« : Сентябрь 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;

ПОЧЕМУ?Непонимающий??
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Сентябрь 05, 2011, 11:12 »

Потому что так нельзя делать. Используй QDataStream.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
ddrtn
Гость
« Ответ #2 : Сентябрь 05, 2011, 11:12 »

QString не является POD типом. для передачи в сокет поля структуры лучше серилизовать. если же передавать структуру бинаро, то вместо QString нужно пользоваться char[] с постоянным размером.
Записан
Vladimir
Крякер
****
Offline Offline

Сообщений: 305



Просмотр профиля
« Ответ #3 : Сентябрь 05, 2011, 11:15 »

Потому что так нельзя делать. Используй QDataStream.

QString без QDataStream не передашь что ли? Мне нужно сделать методами read()/write().. без QDataStream..
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #4 : Сентябрь 05, 2011, 11:21 »

При помощи QDataStream все записываешь в QByteArray, который уже и передаешь.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Vladimir
Крякер
****
Offline Offline

Сообщений: 305



Просмотр профиля
« Ответ #5 : Сентябрь 05, 2011, 11:29 »

При помощи QDataStream все записываешь в QByteArray, который уже и передаешь.

ты не обратил внимание.. я и передаю QByteArray! Для этого не обязательно использовать QDataStream
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #6 : Сентябрь 05, 2011, 11:36 »

ты не обратил внимание.. я и передаю QByteArray! Для этого не обязательно использовать QDataStream
Необязательно, но так как вы записываете делать нельзя.
Если упрощённо объяснить, то QString внутри содержит указатель (адрес в памяти) и вместо текста вы передаёте его. В клиенте этот указатель ссылает фактически в никуда.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #7 : Сентябрь 05, 2011, 11:39 »

Вообще, не используй такой сишный каст структуры к чему-то другому и обратно. Используй сериализацию.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Vladimir
Крякер
****
Offline Offline

Сообщений: 305



Просмотр профиля
« Ответ #8 : Сентябрь 05, 2011, 15:37 »

И все же как конкретно передать текстовое сообщение, если не QString..?
Объявить в структуре как вариант char name[1024]; и передавать таким образом?
Тогда попутно еще вопросик почему при конвертации из QString в char в конце добавляется мусор?

Код:
QString wayFile;
objHead.name[i] = wayFile.at(i).toAscii();
 
В замешательстве
 

Записан
Рома
Гость
« Ответ #9 : Сентябрь 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;
 

Думаю, так должно сработать.
Записан
Vladimir
Крякер
****
Offline Offline

Сообщений: 305



Просмотр профиля
« Ответ #10 : Сентябрь 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];
}
Записан
asvil
Гость
« Ответ #11 : Сентябрь 05, 2011, 17:31 »

А почему вам не нужно QDataStream?
Записан
Vladimir
Крякер
****
Offline Offline

Сообщений: 305



Просмотр профиля
« Ответ #12 : Сентябрь 05, 2011, 17:39 »

А почему вам не нужно QDataStream?

Задание на работе такое дали  Улыбающийся сделать без QDataStream методами read()/write()!
Записан
BRE
Гость
« Ответ #13 : Сентябрь 05, 2011, 17:54 »

Vladimir, ты сейчас занес микроскоп над гвоздем и пытаешься всем объяснить, что молоток тебе не нужен. Подмигивающий
На самом деле в теме передачи структуры по сети очень много подводных камней. Это и выравнивание полей структуры и разный порядок хранения + необходимость перевода чисел в сетевой порядок. Опять же отправка объектов (тег же строк).
QDataStream как раз и решает все эти проблемы.

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

Задание на работе такое дали  Улыбающийся сделать без QDataStream методами read()/write()!
Тогда читать про все описанное выше: выравнивание полей структур, порядок байт (что-то я возможно еще упустил) и бороть самому. Исходники QDataStream в этом здорово помогут. Улыбающийся
« Последнее редактирование: Сентябрь 05, 2011, 18:19 от BRE » Записан
Vladimir
Крякер
****
Offline Offline

Сообщений: 305



Просмотр профиля
« Ответ #14 : Сентябрь 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, а в книженциях каких это можно глянуть?!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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