Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241

Как в структуру ложится последовательность байтов?

15.12.2011, 22:30. Показов 1418. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вобщем не очень понятно как в структуру ложится последовательность байтов.
Есть код сниффера
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include <conio.h>
#include <stdio.h>
#include <winsock2.h>
 
#define MAX_PACKET_SIZE    0x10000
#define SIO_RCVALL         0x98000001
// Буфер для приёма данных
char Buffer[MAX_PACKET_SIZE]; // 64 Kb
 
//Структура заголовка IP-пакета
 
typedef struct IPHeader {
  UCHAR   iph_ver:4, iph_len:4;   // версия и длина заголовка
  UCHAR   iph_tos;      // тип сервиса
  USHORT  iph_length;   // длина всего пакета
  USHORT  iph_id;       // Идентификация
  USHORT  iph_offset;   // флаги и смещения
  UCHAR   iph_ttl;      // время жизни пакета
  UCHAR   iph_protocol; // протокол
  USHORT  iph_xsum;     // контрольная сумма
  ULONG   iph_src;      // IP-адрес отправителя
  ULONG   iph_dest;     // IP-адрес назначения
  WORD   iph_port;
  WORD   iph_destport;
} IPHeader;
 
char src[10];
char dest[10];
char ds[15];
unsigned short lowbyte;
unsigned short hibyte;
 
void main()
{
  WSADATA     wsadata;   // Инициализация WinSock.
  SOCKET      s;         // Cлущающий сокет.
  char        name[128]; // Имя хоста (компьютера).
  HOSTENT*    phe;       // Информация о хосте.
  SOCKADDR_IN sa;        // Адрес хоста
  IN_ADDR sa1;        //
  unsigned long        flag = 1;  // Флаг PROMISC Вкл/выкл.
 
  // инициализация
  WSAStartup(MAKEWORD(2,2), &wsadata);
  s = socket( AF_INET, SOCK_RAW, IPPROTO_IP );
  gethostname(name, sizeof(name));
  phe = gethostbyname( name );
  ZeroMemory( &sa, sizeof(sa) );
  sa.sin_family = AF_INET;
  sa.sin_addr.s_addr = ((struct in_addr *)phe->h_addr_list[0])->s_addr;
  bind(s, (SOCKADDR *)&sa, sizeof(SOCKADDR));
  
  // Включение promiscuous mode.
  ioctlsocket(s, SIO_RCVALL, &flag);
 
  // Бесконечный цикл приёма IP-пакетов.
  while( !_kbhit() )
  {
    int count;
    count = recv( s, Buffer, sizeof(Buffer), 0 );
    // обработка IP-пакета
    if( count >= sizeof(IPHeader) )
    {
      IPHeader* hdr = (IPHeader *)Buffer;
      //Начинаем разбор пакета...
  sa1.s_addr = hdr->iph_src;
 
  strcpy(src,"Пакет: ");
  CharToOem(src,dest);
  printf(dest);
  // Преобразуем в понятный вид адрес отправителя.
  printf("From ");
  printf(inet_ntoa(sa1));
 
  // Преобразуем в понятный вид адрес получателя.
  printf(" To ");
  sa1.s_addr = hdr->iph_dest;
  printf(inet_ntoa(sa1));
 
  // Вычисляем протокол. Полный список этих констант
  // содержится в файле winsock2.h
  printf(" Prot: ");
  printf("%d:",htons(hdr->iph_destport));
  printf("%d ",htons(hdr->iph_port));
  if(hdr->iph_protocol == IPPROTO_TCP) printf("TCP ");
 
  // Вычисляем размер. Так как в сети принят прямой порядок
  // байтов, а не обратный, то прийдётся поменять байты местами.
  printf("Size: ");
  lowbyte = hdr->iph_length>>8;
  hibyte = hdr->iph_length<<8;
  hibyte = hibyte + lowbyte;
  printf("%d",hibyte);
 
  // Вычисляем время жизни пакета.
  printf("\n");
 
    }
  }
 
  closesocket( s );
  WSACleanup();
}
Вот в этой строке
C++
1
IPHeader* hdr = (IPHeader *)Buffer;
указатель на char преобразовывается в структуру, если с первыми двумя элементами понятно, первые 4 байта пишутся в iph_ver следуйщие 4 в iph_len, а вот дальше как они распределяются? Ну вот например сколько запишется в iph_tos или iph_protocol ? Гдето видел такуюже структуру но без последних двух елементов iph_port и iph_destport, а здесь они добавлены и что в них пишется?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.12.2011, 22:30
Ответы с готовыми решениями:

Как искать последовательность байтов в файлах большого размера
Как искать последовательность байтов в файлах большого размера? (может достигать несколько гигабайт) Нужны позиции всех совпадений.

Последовательность байтов
Как представить файл ввиде последовательности байтов? Чтобы потом с этой последовательности проводить какие то операции.

Последовательность байтов, возвращаемых InternetReadFile
Привет всем. У меня задача извлечь с сайта некоторый текст и отобразить его на мониторе. Я извлекаю текст с помощью этих трех функций: ...

6
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
15.12.2011, 23:00
Сколько байт приходится на ту или иную переменную структуры зависит от ее типа. чтобы узнать точно посмотрите, что возвращает выражение sizeof(Type); Последовательность байт соответствует последовательности перечисления переменных в структуре. Первый байт на первую переменную, второй на вторую, третий и четвертый на третью если она двухбайтная и так далее.
C++
1
2
3
4
5
sizeof(UCHAR) == 1 (один байт)
sizeof(USHORT) == хз
sizeof(WORD) == 2
sizeof(ULONG) == 4 - скорее всего.
//  ну и так далее для всех типов.
UCHAR iph_ver:4, iph_len:4; // версия и длина заголовка - такая запись наверно относится к битам а не к байтам. врочем, в этом не уверен. один раз когда-то давно подобное видел.
1
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
15.12.2011, 23:12  [ТС]
DU, как я понимаю эта структура должна заполнятся по этой таблице http://ru.wikipedia.org/wiki/IPv4
Согласно таблице 3 параметр iph_tos блиной 6 байт (8-13), но тип UCHAR размером 1байт. Вопрос тот же: Как? Как распределяются даные по элементам структуры?
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
15.12.2011, 23:39
Согласно таблице 3 параметр iph_tos блиной 6 байт (8-13)
По ссылке все вроде в битах а не в байтах.
1
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
16.12.2011, 00:17  [ТС]
DU, Да вы правы! Перечитал ещё раз таблицу и понял что байты по горизонтали, а по вертикали 32 бита. Но снова не состыковка, первые 5 блоков iph_ver, ipр_len, iph_tos, iph_length, iph_id расположены в одном байте, но типы занимают 1 + 1 + 2 + 2 (USHORT = 2) = 6, а нужно запихнуть 1. Как же?
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
16.12.2011, 00:26
вы опять не поняли. одна горизонтальная полоска от начала до конца занимает 32 бита (4 байта).
первая занимает 32 бита, вторая тоже 32 бита и остальные тоже по 32 бита.
в каждой такой полоске расписано какие байты (и биты от этих байтов) за что отвечают.
вот атльернативаня картинка на структуру пакета
http://lseti.ru/bez19/5-17.htm
может по ней вам будет понятнее.
1
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
16.12.2011, 00:52  [ТС]
DU, Ну прям огромное спасибо! Я чёт подумал что в одном байте 32 бита
Просто открыли глаза.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.12.2011, 00:52
Помогаю со студенческими работами здесь

Просуммировать последовательность байтов в цикле
Доброе время суток)) Помогите пожалуйста. Дана последовательность байтов (положительные числа). Просуммировать их в цикле. Результат по...

Сформировать в двоичном файле последовательность из N байтов
Сформировать в двоичном файле последовательность из N байтов следующего вида: 00000001 00000010 00000100 ... после 10000000 цикл...

Записать последовательность нулей и единиц в виде байтов
Здравствуйте, очень нужна помощь. Есть список нулей и единиц, и нужно их преобразовать в виде байтов, что бы получить исходный файл. Как...

Дана последовательность байтов (положительные числа). Просуммировать их в цикле
Дана последовательность байтов (положительные числа). Просуммировать их в цикле. Результат по размеру может быть 16-битным. Вывести...

Поиск и замена указанной последовательности байтов на другую последовательность в файле или группе файлов
Прошу , помогите с заданием . Задание Поиск и замена указанного последовательности байтов на другую последовательность в файле или...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru