Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/26: Рейтинг темы: голосов - 26, средняя оценка - 4.62
237 / 210 / 29
Регистрация: 08.06.2011
Сообщений: 467
1

Получение данных из TCP пакета

10.07.2011, 01:31. Показов 5428. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вот код:
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
#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_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;
 
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;
      //Начинаем разбор пакета...
 
    strcpy(src,"Packet: ");
    CharToOem(src,dest);
    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));
 
    // Вычисляем протокол. Полный список этих констант
    // содержится в файле winsock2.h
    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("%d",hibyte);
 
    // Вычисляем время жизни пакета.
    printf(" TTL:%d",hdr->iph_ttl);
    printf("\n");
 
    }
  }
  closesocket( s );
  WSACleanup();
}
он сниффит только заголовки IP пакетов, мне нужно получить данные из TCP пакетов,
думаю реализовать это так:
Создаем буфер размером 65536, структуры IPHeader и TCPHeader.
Получаем по сокету в буфер IP пакет, заполняем стр-ру IPHeader, читаем из нее поле Header Length и если протокол - TCP заполняем стр-ру TCPHeader:
C
1
TCPHeader *tcp_hdr = (TCPHeader *)(Buffer + (Header_Length * 32 / 8));
Из этой структуры читаем поле Data offset и с его помощью вычисляем смещение данных TCP пакета:
C
1
char *tcp_data = Buffer + ((Header_Length + Data_offset) * 32 / 8);
Правилен ли этот алгоритм?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.07.2011, 01:31
Ответы с готовыми решениями:

Передача пакета данных TCP через интернет
Доброе время суток!:) Я студент, пишу дипломную работу по передачи данных используя стек...

Получение пакета данных(не знаю с чего начать)
Всем привет. я не знаю с чего начать вопрос, для меня эта тема сильно новая, даже сказал бы...

Получение данных из контроллера по TCP
Здравствуйте! У меня есть анализатор мощности, который меряет напряжение, у него есть Ethernet и...

Синхронное получение данных TCP IP
Салют, комрады! Может кто сталкивался с такой проблемкой при работе с данными через TCP IP....

1
537 / 459 / 3
Регистрация: 08.07.2009
Сообщений: 2,625
10.07.2011, 12:02 2
Есть ещё, так называемый, ужатый TCP хидер/пакет (я уже не помню). Его этот алгоритм никак не учитывает.
0
10.07.2011, 12:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.07.2011, 12:02
Помогаю со студенческими работами здесь

Tcp client отправка и получение данных
Здравствуйте, подскажите пожалуйста что делаю не так. Пишу приложение для android, необходимо...

Получение XML данных по TCP порту
Здравствуйте, Пишу приложение, которое будет получать XML-данные по TCP, а затем писать эти...

Как происходит получение данных через протокол TCP
Имеется клиент-серверное приложение: using System; using System.Collections.Generic; using...

Разбор TCP пакета
Подскажите я нашел примеры на C# но там надо подключать PcapDotNet. Можно ли без него собрать ICMP...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru