Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.96/25: Рейтинг темы: голосов - 25, средняя оценка - 4.96
Деструктор ума
 Аватар для log
22 / 22 / 0
Регистрация: 07.03.2009
Сообщений: 326

Обработка пакета

14.11.2012, 21:37. Показов 5378. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Хочу доработать программу по приему пакетов по UDP протоколу.
Есть прием пакета, откуда, от кого, по какому протоколу, размер пакета всего, время жизни пакета и выводится то, что в буфере лежит ( то есть в поступившем пакете)
Прошу помочь реализовать несколько задач.
1. Есть файл текстовый. В нем 2 IP-адреса. Например так:
C++
1
2
ip1=190.120.101.1
ip2=190.120.101.2
Мне нужно сделать так, чтобы программа открывала этот файл, и сравнивала IP-адрес откуда пришел пакет, который она в данный момент обрабатывает. То есть, чтобы айпишник источника каждого пакета она проверяла с этими 2-мя айпишниками, которые в файле. Если к примеру совпала с первым, то мы в конце выводим еще одну строку : 1ip , если со вторым, то ip2.
2. У меня есть параметр, определенный в структуре
C++
1
UCHAR   iph_verlen;   // версия и длина заголовка
Нужно, чтобы размер всего пакета вычитал эту длину заголовка. в результате я получу размер конкретных данных которые мне нужны. получив этот размер, надо его сравнить с 64 байтами и в итоге, если равны размеры, вывести слово "совпало", если нет, то "не совпало"

Прошу помощи у магистров, а то плохо представляю как это реализовать.
Вот мой код:

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
//---------------------------------------------------------------------------
#include <conio.h>
#include <stdio.h>
#include <winsock2.h>
#include <vcl.h>
#include <sstream>
#include <iostream>
#include <sstream>
#include <iostream>
#pragma comment (lib, "ws2_32.lib")
#define MAX_PACKET_SIZE    0x10000
#define SIO_RCVALL         0x98000001
char Buffer[MAX_PACKET_SIZE]; // 64 Kb
 
//структура заголовка IP-пакета
 
typedef struct IPHeader {
  UCHAR   iph_verlen;   // версия и длина заголовка
  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-адрес получателя
} IPHeader;
int count;
char src[10];
char dest[10];
char ds[15];
unsigned short lowbyte;
unsigned short hibyte;
 
int main(void)
{
 
  WSADATA     wsadata; 
  SOCKET      s;         
  char        name[128]; 
  HOSTENT*    phe;       
  SOCKADDR_IN sa;       
  IN_ADDR sa1;        
  unsigned long        flag = 1;  
 
  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));
  ioctlsocket(s, SIO_RCVALL, &flag);
  while(1)
  {
    int count;
    count = recv( s, Buffer, sizeof(Buffer), 0 );
    if( count >= sizeof(IPHeader) )
    {
      IPHeader* hdr = (IPHeader *)Buffer;
    strcpy(src,"Ïàêåò: ");
    printf(dest);
//от кого
    printf("From ");
    sa1.s_addr = hdr->iph_src;
    printf(inet_ntoa(sa1));
//куда
    printf(" To ");
    sa1.s_addr = hdr->iph_dest;
    printf(inet_ntoa(sa1));
//протокол
    printf(" Prot: ");
    if(hdr->iph_protocol == IPPROTO_TCP) printf("TCP ");
    if(hdr->iph_protocol == IPPROTO_UDP) printf("UDP ");
//размер пакета
    printf("Size: ");
    lowbyte = hdr->iph_length>>8;
    hibyte = hdr->iph_length<<8;
    hibyte = hibyte + lowbyte;
    printf("%u", hibyte);
//время жизни пакета
    printf(" TTL:%s",itoa(hdr->iph_ttl,ds,10));
    printf("\n");
//выводим то, что в буфере лежит
    printf("%i\n",(*((int*)(Buffer+sizeof(IPHeader))))&0xFF);
    }
  }
  closesocket( s );
  WSACleanup();
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.11.2012, 21:37
Ответы с готовыми решениями:

Величина пакета
Доброго времени суток! Подскажите, какая максимальная длина поля данных в TCP и UDP пакетах. Какой объем данных за один раз лучше всего...

Перехват пакета с нуля
с чего начать чтобы создать снифферы, перехватчики пакета ...? Добавлено через 6 минут Помогите.

Структура TCP пакета
TCP пакет, в данном случае, это порция данных переданная по TCP. И у меня такой вопрос. Вот заголовок этого пакета содержит Inthernet, IP,...

16
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
15.11.2012, 13:31
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
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
 
struct ip_desc
{
    std::string desc;
    std::string ip;
};
 
std::istream &operator>>(std::istream &in, ip_desc &obj)
{
    std::string s;
    getline(in, s);
    int pos = s.find('=');
    if (pos == std::string::npos)
    {
        in.setf(std::ios::failbit, 0);
    }
    else
    {
        obj.desc = s.substr(0, pos);
        obj.ip = s.substr(pos + 1);
    }
    return in;
}
 
static std::vector<ip_desc> ip_db;
 
bool read_ip_db(std::istream &in)
{
    while (true)
    {
        ip_desc obj;
        in >> obj;
        if (in.fail()) break;
        ip_db.push_back(obj);
        if (in.peek() == EOF) break;
    }
    return !in.fail();
}
 
ip_desc find_ip(const std::string &ip)
{
    ip_desc res;
 
    for
    (
        std::vector<ip_desc>::iterator i = ip_db.begin();
        i != ip_db.end();
        i++
    )
    {
        if (i->ip == ip)
        {
            res = *i;
            break;
        }
    }
 
    return res;
}
 
...
    std::ifstream in("1.txt");
 
    if (!in || !read_ip_db(in))
    {
        //can not read file
    }
 
    in.close();
...
    ip_desc p = find_ip(inet_ntoa(sa1));
    if (!p.ip.length())
    {
        //can not find ip
    }
    else
    {
        //do something
    }
...
    if (count - sizeof(IPHeader) == 64)
    {
        //do something
    }
1
Деструктор ума
 Аватар для log
22 / 22 / 0
Регистрация: 07.03.2009
Сообщений: 326
15.11.2012, 17:10  [ТС]
vxg, опять спасибо за вашу помощь.
но я не совсем все понял, что вы сделали.
если не затруднит, не могли бы вы закомментировать.
особенно первую часть.
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
struct ip_desc
{
    std::string desc;
    std::string ip;
};
 
std::istream &operator>>(std::istream &in, ip_desc &obj)
{
    std::string s;
    getline(in, s);
    int pos = s.find('=');
    if (pos == std::string::npos)
    {
        in.setf(std::ios::failbit, 0);
    }
    else
    {
        obj.desc = s.substr(0, pos);
        obj.ip = s.substr(pos + 1);
    }
    return in;
}
 
static std::vector<ip_desc> ip_db;
 
bool read_ip_db(std::istream &in)
{
    while (true)
    {
        ip_desc obj;
        in >> obj;
        if (in.fail()) break;
        ip_db.push_back(obj);
        if (in.peek() == EOF) break;
    }
    return !in.fail();
}
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
15.11.2012, 22:15
описал структуру которая буде хранить ip и описание (некую строку которую мы хотим отображать)
описал оператор для считывания этой структуры из файла
описал вектор структур среди которых мы будем искать совпадения ip
описал процедуру читающую этот вектор из файла
1
Деструктор ума
 Аватар для log
22 / 22 / 0
Регистрация: 07.03.2009
Сообщений: 326
19.11.2012, 20:56  [ТС]
А все таки, как исходя из моей структуры
C++
1
2
3
4
5
6
7
8
9
10
11
12
typedef struct IPHeader {
  UCHAR   iph_verlen;   // версия и длина заголовка
  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-адрес получателя
} IPHeader;
по параметрам пакета iph_length и iph_verlen, т.е. его полный размер минус размер его заголовка будет равен размеру так называемого конкретного поле, с которым мне дальше оперировать.
как это сделать vxg? например получив этот размер конкретного поля, нужно его вывести.
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
19.11.2012, 22:39
то что в заголовке записана его длина, это конечно хорошо, но вам то зачем с ней работать? вы и так знаете длину заголовка и можете смело оперировать с данными идущими в буфере сразу после заголовка. как оперировать? все зависит от того что вы с ними делаете. если это строка оканчивающаяся нулевым символом просто выводите ее через
C++
1
printf("%s", Buffer + sizeof(IPHeader));
если это слово, то
C++
1
printf("%hi", *(short *)(Buffer + sizeof(IPHeader)));
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
20.11.2012, 11:39
Цитата Сообщение от log Посмотреть сообщение
А все таки, как исходя из моей структуры
Проще/красивей структуру ip заголовка переписать с bit-fields отделив версию от длины. А так, ручками (для интел архитектуры)- сдвинуть в право на 2 и сбросить младшие 2бита(остаток от версии), полученное число вычесть из общей длинны пакета.

Добавлено через 3 минуты
Цитата Сообщение от vxg Посмотреть сообщение
вы и так знаете длину заголовка и можете смело оперировать с данными идущими в буфере сразу после заголовка
Не знает он ее заранее.
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
20.11.2012, 13:39
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
Не знает он ее заранее
а если не знает чего же тогда взмахи с sizeof(IPHeader) производятся
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
20.11.2012, 13:56
vxg, Вы вообще о чем???
Код ни Ваш ни ТС я не читал, поиск по топику дает:
Цитата Сообщение от log Посмотреть сообщение
if( count >= sizeof(IPHeader) )
Если прочитанно не меньше чем минимально возможная длина IP пакета, что-то там делать... Все логично и правильно.
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
20.11.2012, 14:24
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
Не знает он ее заранее
знает он эту длину. во всяком случае код создан таким образом что не смотря на наличие у структуры поля в котором указан размер структуры эта информация никак не используется - код просто знает с какой структурой он работает и какой у нее размер. конечно можно было бы универсальством заняться и выцеплять фактическую длину из заголовка. ни разу просто такого не видел.
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
20.11.2012, 14:43
Если на пальцах: у _каждый_ ip пакет состоит из заголовка и данных (опционально), в свою очередь заголовок состоит из обязательной части (как раз она и описана структурой у ТС) и (опционально) дополнительной части, наличие и размер которой как раз и определяется по полю IHL.
Если Вы где-то увидели код работающий с raw сокетами и не делающий разбор и проверку заголовка - это плохой и негодный код.
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
20.11.2012, 14:59
вот теперь все четко. да, тогда TC нужно оперировать этим размером, а не размером обязательной части
0
Деструктор ума
 Аватар для log
22 / 22 / 0
Регистрация: 07.03.2009
Сообщений: 326
20.11.2012, 18:57  [ТС]
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
Проще/красивей структуру ip заголовка переписать с bit-fields отделив версию от длины. А так, ручками (для интел архитектуры)- сдвинуть в право на 2 и сбросить младшие 2бита(остаток от версии), полученное число вычесть из общей длинны пакета.
ну так то я в голове представляю, как получить размер нужной мне части пакета, но как это программно реализовать не знаю. Потому и попросил вашей помощи.

Добавлено через 7 минут
vxg, а на счет IPшников из файла.
Думаю можно по простому. есть файл. и, чтобы к нему не оперировать каждый раз при приеме пакета, можно сделать так:
там запись примерно следующая:

C++
1
2
3
4
5
////////
///файл
/////////
ip1='190.120.101.1:3423'
ip2='190.120.101.2:3422'
просто дать программе команду проверять каждую строчку, а именно
когда она найдет символ " ' ", то все что идет до " : " нужно записать в параметр " а1 ", а все что после " : " идет до " ' " записать в параметр " b1 ".
Аналогично дальше произвести запись в параметры " а2 " и " b2 "
Т.е. а1, а2 - IPшники , а b1, b2 -порты.

Помогите это программно реализовать пожалуйста.
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
20.11.2012, 19:50
Цитата Сообщение от log Посмотреть сообщение
ну так то я в голове представляю, как получить размер нужной мне части пакета, но как это программно реализовать не знаю. Потому и попросил вашей помощи.
Вы уж извините, объяснить/пояснить что-то - всегда пожалуйста, но писать за Вас никакого желания нет.
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
20.11.2012, 22:40
Цитата Сообщение от log Посмотреть сообщение
Помогите это программно реализовать пожалуйста
нахрена? я вам написал функцию которая выгребает из файла список пар "строка вида ip1" - "ай пи" и функцию которая рыщет по этому списку проверяя есть ли в нем указанный вами ай пи и возвращает запись из этого списка из которой вы можете выцепить "строку вида ip1" - чего еще с чем сравнивать и где искать?
0
Деструктор ума
 Аватар для log
22 / 22 / 0
Регистрация: 07.03.2009
Сообщений: 326
20.11.2012, 22:47  [ТС]
Цитата Сообщение от vxg Посмотреть сообщение
чего еще с чем сравнивать и где искать?
ну я маленько не доглядел, там не только ip, но и протокол

Цитата Сообщение от log Посмотреть сообщение
ip1='190.120.101.1:3423'
ip2='190.120.101.2:3422'
потому хотелось бы чтобы прога присвоила каждому айпишнику и порту конкретные параметры, всего выходит что их 4-ре. чтобы каждый раз опять же файл не открывать, когда приходит пакет, а уже в прогу загрузить айпишники и порты из файла присвоив им параметры.
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
21.11.2012, 10:45
не нужно его каждый раз открывать - вы его один раз открыли, разобрали и храните всю эту информацию в памяти столько сколько вам нужно. если там еще и порты - считайте и порты тоже
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.11.2012, 10:45
Помогаю со студенческими работами здесь

Сокеты определение пакета
Добрый день, решил поинтересоваться чисто теоретической частью работой с сокетами. А конкретнее с получением пакетов. Допустим есть задача...

Обработка бинарного пакета
Здравствуйте. Сразу пардон за левый вопрос. Итак, сервер раздаёт бинарные файлы. Внутри каждого по одной структуре. Я ловлю этот...

Куски пакета от сервера: правильное их соединение и обработка.
Всем привет. Столкнулся с такой неприятной проблемой. Клиент отправляет на сервер данные, которые обрабатываются на сервере и с ними идет...

Возможно ли при импорте в модуль пакета подняться выше пакета?
Есть скрипты .py, лежащие на одном уровне(в одном каталоге) и есть пакет модулей, лежащий на том же самом уровне. Возможно ли...

Сборка пакета
В общем есть схема - по ней надо собрать пакет (положить данные в массив), но вот ума не приложу как это сделать - может у кого то будут...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru