Название: Чтение из сокета Отправлено: Vladimir от Сентябрь 05, 2011, 11:10 Добрый день! Такой вопрос..
Есть структура одна и та же у клиента и у сервера Код: struct headl Сервер Код: QByteArray 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; :-\ Название: Re: Чтение из сокета Отправлено: Рома от Сентябрь 05, 2011, 16:24 Попробуйте так
Код
Код
Думаю, так должно сработать. Название: Re: Чтение из сокета Отправлено: Vladimir от Сентябрь 05, 2011, 17:28 Попробуйте так Код
Код
Думаю, так должно сработать. Да скорее всего и будет, но мне нужно без QDateStream! Понял почему дописывает левые символы - всё дело в структуре! имя записанное в objHead.name должно быть меньше 32 символов! Следовательно вопрос: что нужно сделать чтобы можно было передавать имена больше 32 символов? Код: struct headl Название: 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; Задание на работе такое дали :) сделать без QDataStream методами read()/write()! Тогда читать про все описанное выше: выравнивание полей структур, порядок байт (что-то я возможно еще упустил) и бороть самому. Исходники QDataStream в этом здорово помогут. :)Название: Re: Чтение из сокета Отправлено: Vladimir от Сентябрь 05, 2011, 23:55 Vladimir, ты сейчас занес микроскоп над гвоздем и пытаешься всем объяснить, что молоток тебе не нужен. ;) На самом деле в теме передачи структуры по сети очень много подводных камней. Это и выравнивание полей структуры и разный порядок хранения + необходимость перевода чисел в сетевой порядок. Опять же отправка объектов (тег же строк). QDataStream как раз и решает все эти проблемы. Понял почему дописывает левые символы - всё дело в структуре! Нет, все дело в том, что так:Код: QString wayFile; Задание на работе такое дали :) сделать без QDataStream методами read()/write()! Тогда читать про все описанное выше: выравнивание полей структур, порядок байт (что-то я возможно еще упустил) и бороть самому. Исходники QDataStream в этом здорово помогут. :)"Vladimir, ты сейчас занес микроскоп над гвоздем и пытаешься всем объяснить, что молоток тебе не нужен." шикарно =)) про strcpy, strcmp в курсе - учту! "выравнивание полей структур" я и пытался сделать.. ну что-то безуспешно, либо читает с именем больше 32 символов, а меньше нет, либо наоборот..Значит, исходники QDataStream, а в книженциях каких это можно глянуть?! |