Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > Как передавать char* по сети?


Автор: eXa 25.1.2008, 16:25
Код

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] 







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

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

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

в неё
Код

strcpy(t8, "blaggg");

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

Автор: eXa 25.1.2008, 17:58
Да! Точно! Спасиб!
Осталось избавиться от лишних байт. Ведь же это в выравнивании дело, да?
хотя нее...
странно получается он выделяет 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     
-------------               

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

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

Автор: eXa 25.1.2008, 20:26
Цитата

это 4-е байта 

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

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

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

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

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


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

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

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

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

Автор: JackYF 26.1.2008, 09:20
Цитата(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

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

Автор: eXa 26.1.2008, 14:12
Код:
Код

#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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)