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