Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как передавать char* по сети? из "Как правильно класть WORD, DWORD, BYTE" 
V
    Опции темы
eXa
Дата 25.1.2008, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 1.12.2006

Репутация: нет
Всего: нет



Код

struct ttt
{
  BYTE      t1;
  BYTE      t2;
  WORD    t3;
  WORD    t4;
  DWORD  t5;
  WORD    t6;
  WORD    t7;
  CHAR*    t8;
} ttt packet;

packet.t1 = 0x2A;
packet.t2 = 0x01;
packet.t3 = 0xC31F;
packet.t4 = htons(56);
packet.t5 = htons(1);
packet.t6 = 1;
packet.t7 = 4;
packet.t8 = "test";



При проверке в сеть отправляется следующее:
Код

2A 01 C3 1F 00 56 00 00 00 01 00 00 01 00 04 00 00 00 00 *...........


а должно
Код
  
2A 01 C3 1F 00 56 00 00 00 01 00 01 00 04 74 65 73 74   *...........test 


откуда вылезает лишний байт? я думаю что это дело в выравнивании, можете пояснить?
Код

2A 01 C3 1F 00 56 00 00 00 01 [00] 00 01 00 04 00 00 00 00


и как правильно чар передавать? поидее по таблице ascii должен отправить символы, а отправляются нули
Код

2A 01 C3 1F 00 56 00 00 00 01 00 00 01 00 04[00 00 00 00] 








Это сообщение отредактировал(а) eXa - 26.1.2008, 14:34
PM MAIL   Вверх
JackYF
Дата 25.1.2008, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 1
Всего: 162



Цитата(eXa @  25.1.2008,  15:25 Найти цитируемый пост)
CHAR*    t8;

это указатель. Памяти выделять кто-будет? заводи константу типа
Код

const int T8_SIZE = 16;
char t8[T8_SIZE];

в неё
Код

strcpy(t8, "blaggg");

И тогда заработает.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
eXa
Дата 25.1.2008, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 1.12.2006

Репутация: нет
Всего: нет



Да! Точно! Спасиб!
Осталось избавиться от лишних байт. Ведь же это в выравнивании дело, да?
хотя нее...
странно получается он выделяет 8 байт под тип WORD
*code*
BYTE t1;
BYTE t2;
WORD t3;
WORD t4;
DWORD t5;
WORD t6;
WORD t7;
CHAR t8[10];

packet.t1 = 0x2A;
packet.t2 = 0x01;
packet.t3 = 0xA401;
packet.t4 = htons(30);
packet.t5 = htons(1);
packet.t6 = htons(1);
packet.t7 = htons(len);
strcpy(packet.t8, "test");
*endcode*

--------------
2A 01 A4 01 00 5E 00 00 00 01 00 00 00 01 00 04 74 65 73 74     
-------------               


Это сообщение отредактировал(а) eXa - 25.1.2008, 19:20
PM MAIL   Вверх
JackYF
Дата 25.1.2008, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 1
Всего: 162



Цитата(eXa @  25.1.2008,  16:58 Найти цитируемый пост)
00 00 00 01

это 4-е байта smile
и дело действительно в выравнивании, поставь нужную прагму компилятору


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
eXa
Дата 25.1.2008, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 1.12.2006

Репутация: нет
Всего: нет



Цитата

это 4-е байта 

извеняюсь за не точность
Цитата

и дело действительно в выравнивании, поставь нужную прагму компилятору

не просто поставить, а ещё с параметром подходящий для моей структуры, вот чтот нашёл,читаю, попробывал, но никак не могу вникнуть, как определить какое выравнивание мне нужно?

Выравниваю так, запись идёт также
Код

#pragma pack(push, n)
struct
{
}
#pragma pack (pop)



Это сообщение отредактировал(а) eXa - 25.1.2008, 20:35
PM MAIL   Вверх
JackYF
Дата 25.1.2008, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 1
Всего: 162



Цитата(eXa @  25.1.2008,  19:26 Найти цитируемый пост)
#pragma pack(push, n)

выравнивание в таких случаях ставится 1 байт.

Добавлено через 20 секунд
#pragma pack(push, 1)


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
eXa
Дата 26.1.2008, 01:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 1.12.2006

Репутация: нет
Всего: нет



при выравнивании на 1(пробывал и 2, 4, 6, 8, 16) байт dword может принимать при отправке такое 00 00 01 00 значение и такое при конвертации htons 00 00 01 00, а мне надо 00 00 00 01

Это сообщение отредактировал(а) eXa - 26.1.2008, 01:43
PM MAIL   Вверх
JackYF
Дата 26.1.2008, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 1
Всего: 162



Цитата(eXa @  26.1.2008,  00:23 Найти цитируемый пост)
при выравнивании на 1(пробывал и 2, 4, 6, 8, 16) байт dword может принимать при отправке такое 00 00 01 00 значение и такое при конвертации htons 00 00 01 00, а мне надо 00 00 00 01

давай обстоятельно. С кодом, с выводом...


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
eXa
Дата 26.1.2008, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 1.12.2006

Репутация: нет
Всего: нет



Код:
Код

#pragma pack(push, 1)
struct test
{
  BYTE t1
  BYTE t2
  WORD t3
  WORD t4
  
  DWORD t5
  
  WORD t6
  WORD t7
  CHAR t8[10];
};
struct test pack;
#pragma pack (pop)

  pack.t1 = 0x2A;
  pack.t2 = 0x01;
  pack.t3 = 0x01A4;
  pack.t4 = htons(sizeof(packet)-6);
  pack.t5 = htons(1);
  pack.t6 = htons(1);
  pack.t7 = htons(uinlen);
  strcpy(pack.t8, "test");


Вывод:
2A 01 01 A4 00 58 00 01 00 00 00 01 00 04 74 65   *....X........te
73 74                                                                         st

Это сообщение отредактировал(а) eXa - 26.1.2008, 14:42
PM MAIL   Вверх
JackYF
Дата 26.1.2008, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 1
Всего: 162



Цитата(eXa @  26.1.2008,  13:12 Найти цитируемый пост)
pack.t5 = htons(1);

htonl, потому что DWORD


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0509 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.