[РЕШЕНО] чтение sizeof( int ) в QTcpSocket |
Здравствуйте, гость ( Вход | Регистрация )
[РЕШЕНО] чтение sizeof( int ) в QTcpSocket |
alexei |
27.3.2010, 15:02
Сообщение
#11
|
Студент Группа: Новичок Сообщений: 11 Регистрация: 26.3.2010 Пользователь №: 1570 Спасибо сказали: 0 раз(а) Репутация: 0 |
Попробуй читать с помощью qint64 QIODevice::read ( char * data, qint64 maxSize ), тоесть у тебя получится что-то вроде:
1) Такой код не скомпилировался. 2) Я когда пишу с сервера - сделал преобразование числа посредством htonl, байты пришли в нужном порядке (в сетевом порядке - на стороне qt-клиента не должно быть преобразование на таком низком уровне ручками я полагаю), осталось их правильно обработать: bufAll - содержит данные сокета (считанные посредством readAll() )
|
|
|
ViGOur |
27.3.2010, 15:54
Сообщение
#12
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
Посмоти какое в твоем случае будет значение nSize:
int nSize=0; код написан так же от руки и может не скомпилится, поправь его, bufAll.left( sizeof( int )) должен возвращать char *
|
|
|
alexei |
27.3.2010, 16:26
Сообщение
#13
|
Студент Группа: Новичок Сообщений: 11 Регистрация: 26.3.2010 Пользователь №: 1570 Спасибо сказали: 0 раз(а) Репутация: 0 |
Посмоти какое в твоем случае будет значение nSize: int nSize=0; код написан так же от руки и может не скомпилится, поправь его, bufAll.left( sizeof( int )) должен возвращать char *В этом случае: nSize = 452984832. |
|
|
ViGOur |
27.3.2010, 16:29
Сообщение
#14
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
А если попробовать toAcii или toLocal8bit?
|
|
|
alexei |
27.3.2010, 17:03
Сообщение
#15
|
Студент Группа: Новичок Сообщений: 11 Регистрация: 26.3.2010 Пользователь №: 1570 Спасибо сказали: 0 раз(а) Репутация: 0 |
А если попробовать toAcii или toLocal8bit? Не понял к чему применять и зачем? У меня уже есть вывод в 16-ричном виде:
Вопрос как из этого буфера уже правильно считать число? |
|
|
Litkevich Yuriy |
27.3.2010, 17:22
Сообщение
#16
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
alexei, проблема в следующем: особо вникать в чужую проблему нет ни времени ни желания.
Если б ты привел подробную информацию об отправке и о приёме, то быстрее было бы найдено решение. Напиши например так: Отправляю: Формат | Длинна | Сообщение естест. | число 27 | "hello" HEX | 1B | тоже в HEX'е Принимаю в HEX: 00 00 1B 44 A9 ... Вот если так опишешь, то может и сам поймёшь проблему |
|
|
ViGOur |
27.3.2010, 18:18
Сообщение
#17
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
Если у тебя данные выглядят как 0000001b, то при memcpy в nSize должно записаться число 27.
Иначе используй метод read он аналогичен твоему на других клиентах... |
|
|
alexei |
27.3.2010, 18:36
Сообщение
#18
|
Студент Группа: Новичок Сообщений: 11 Регистрация: 26.3.2010 Пользователь №: 1570 Спасибо сказали: 0 раз(а) Репутация: 0 |
вот код отправки:
Что отправляется: Sat Mar 27 17:57:12 2010 commFunc 27 Sat Mar 27 17:57:12 2010 commFunc 452984832 Sat Mar 27 17:57:12 2010 commFunc <answer><id>0</id></answer> Т.е. размер данных 27 байт, это число мы представили в стандартном для передачи по сети виде (htonl) - 452984832. Следующим пакетом будем пересылать "<answer><id>0</id></answer>" - 27 байт. Итого уехало клиенту - 31. Что происходит на стороне клиента:
Что приехало: available 31 bytes before read buf: //здесь пусто input read: //здесь пусто input read (hex): 00 00 00 1b 3c 61 6e 73 77 65 72 3e 3c 69 64 3e 30 3c 2f 69 64 3e 3c 2f 61 6e 73 77 65 72 3e "3c 61 6e 73 77 65 72 3e 3c 69 64 3e 30 3c 2f 69 64 3e 3c 2f 61 6e 73 77 65 72 3e" = "<answer><id>0</id></answer>" (проверить можно здесь: hex to string) осталось разобраться с 00 00 00 1b делаем так:
действительно nSize = 452984832 Даже htonl не надо делать, пока все писал, вот и разобрался. Отдельное спасибо Litkevich Yuriy (memcpy выручило). |
|
|
ViGOur |
27.3.2010, 18:39
Сообщение
#19
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
Ну вот, а то уже начал думать, что я совсем плохой стал...
|
|
|
alexei |
27.3.2010, 19:10
Сообщение
#20
|
Студент Группа: Новичок Сообщений: 11 Регистрация: 26.3.2010 Пользователь №: 1570 Спасибо сказали: 0 раз(а) Репутация: 0 |
Если у тебя данные выглядят как 0000001b, то при memcpy в nSize должно записаться число 27. Иначе используй метод read он аналогичен твоему на других клиентах... у меня данные пришли такого рода 1b000000. Прочиталось 27 все отлично, но беспокоит один вопрос - ручками не придется делать htonl на других платформах (если сходу кто ответи буду благодарен, если нет, путем ждать - когда у кого то возникнут проблемы =) )? Еще просьба к администраторам. Поскольку я не являюсь автором этой темы (открывал, когда не был зарегистрирован), не могли бы Вы проставить в названии "[ЗАКРЫТО]" ? |
|
|
Текстовая версия | Сейчас: 20.4.2024, 2:27 |