[РЕШЕНО] чтение sizeof( int ) в QTcpSocket |
Здравствуйте, гость ( Вход | Регистрация )
[РЕШЕНО] чтение sizeof( int ) в QTcpSocket |
Гость_alexei_* |
25.3.2010, 12:38
Сообщение
#1
|
Гости |
Уважаемые знатоки, есть вопрос.
На стороне сервера на linux у меня запущена программа, которые принимает соединения. Цикл работы следующий: 1) Получаем запрос на соединений. 2) Отправляем sizeof( int ) данных - размер в байтах идущего сообщения. 3) Отправляем сами данные Раньше был linux-клиент и все работало (читал sizeof( int ) данных, потом определенное число данных из сокета). Решил сделать клиента кроссплатформенным, пытаясь считать данные следующим путем: QTcpSocket::read( (long long int) sizeof( int ) ); // long long int = qint64 Получаю в качестве числа несуразную величину(да и вообще когда приходят данные от сервера их вывод никоим образом не напоминает число в начале, текст в конце то что надо - а вот число, никак не знаю как правильно передавать или считывать). Чем воспользоваться? По другому передавать число или считывать? С уважением, Алексей. |
|
|
ViGOur |
25.3.2010, 20:14
Сообщение
#2
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
1. sizeof(int) в 32 и 64 битных системах отличаются.
2. непонятно как ты записываешь размер данных, как текст или записываешь его в первые 4 или 8 байта? Покажи код отправки. |
|
|
Гость_alexei_* |
26.3.2010, 1:16
Сообщение
#3
|
Гости |
1. sizeof(int) в 32 и 64 битных системах отличаются. 2. непонятно как ты записываешь размер данных, как текст или записываешь его в первые 4 или 8 байта? Покажи код отправки. 1) Мне казалось по стандарту int - 4 байта везде. 2) Вот код для отправки (сначала отправляем размер данных потом сами данные):
|
|
|
Litkevich Yuriy |
26.3.2010, 2:03
Сообщение
#4
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
по стандарту int - 4 байта везде. по стандарту int зависит от реализации. Гарантированную ширину имеют только его модификации с префиксом short и long, например: short int и long intесли тебе нужна гарантия ширины, то используй типы Qt: qint32 qint64 и д.р. fd что это такое у тебя в коде? какому типу данных соответсвует? И что за функция write, от какого класса?
|
|
|
Гость_alexei_* |
26.3.2010, 20:21
Сообщение
#5
|
Гости |
по стандарту int - 4 байта везде. по стандарту int зависит от реализации. Гарантированную ширину имеют только его модификации с префиксом short и long, например: short int и long intесли тебе нужна гарантия ширины, то используй типы Qt: qint32 qint64 и д.р. fd что это такое у тебя в коде? какому типу данных соответсвует? И что за функция write, от какого класса?Серверная часть написана из соображений минимальности использования внешний библиотек (установки Qt например), поэтому там нет таких понятий как qint64. fd - файловый дескриптор сокета, в который пишем данные (тип int). Серверную часть трогать не хочется - потому что она рабочая и общается с другими сущностями по такому искусственному протоколу (если менять сервер, то менять и все остальное). Простой вывод в консоль qt-клиента вырисовывает стрелочку влево (что соответствует в таблице ascii - 28, число которое я передавал со стороны сервера). Можно ли на qt-клиенте правильно обработать эту информацию? |
|
|
alexei |
26.3.2010, 22:07
Сообщение
#6
|
Студент Группа: Новичок Сообщений: 11 Регистрация: 26.3.2010 Пользователь №: 1570 Спасибо сказали: 0 раз(а) Репутация: 0 |
Проверил, на стороне сервера и qt-клиента размеры данных одинаковы:
size of int = 4 size of short int = 2 size of long int = 4 правда число которое я получаю посредством sscanf: 156274600 (в двоичной системе даже на смешение байтов от 28 не похоже) |
|
|
Litkevich Yuriy |
26.3.2010, 23:50
Сообщение
#7
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
alexei, я тебе предлагаю воспользоваться на стороне клиента функцией
QByteArray QIODevice::readAll () А затем преобразовать в HEX, например: Так ты увидишь, что ты принял, сразу в шестнадцатиричной форме.П.С. не забывай, что пакет может фрагментироваться |
|
|
alexei |
27.3.2010, 1:03
Сообщение
#8
|
Студент Группа: Новичок Сообщений: 11 Регистрация: 26.3.2010 Пользователь №: 1570 Спасибо сказали: 0 раз(а) Репутация: 0 |
alexei, я тебе предлагаю воспользоваться на стороне клиента функцией QByteArray QIODevice::readAll () А затем преобразовать в HEX, например: Так ты увидишь, что ты принял, сразу в шестнадцатиричной форме.П.С. не забывай, что пакет может фрагментироваться Привожу куски кода qt-клиента (каким образом происходит чтение, не понял зачем мне смотреть шестнадцатиричная форму, когда я смотрю текст в обычном для чтения представлении): QByteArray responseArr; // элемент класса
|
|
|
alexei |
27.3.2010, 14:08
Сообщение
#9
|
Студент Группа: Новичок Сообщений: 11 Регистрация: 26.3.2010 Пользователь №: 1570 Спасибо сказали: 0 раз(а) Репутация: 0 |
Спасибо за совет с hex. Действительно байты перемешались, надо правильно инициализировать соединение. Будем разбираться
|
|
|
ViGOur |
27.3.2010, 14:19
Сообщение
#10
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
Попробуй читать с помощью qint64 QIODevice::read ( char * data, qint64 maxSize ), тоесть у тебя получится что-то вроде:
|
|
|
Текстовая версия | Сейчас: 25.4.2024, 15:02 |