алверт, К. Рейсдорф C/С ++: Borland C ++ Builder 6 - підручник
. У. Річард Стівенс Протоколи TCP/IP. Практичне керівництво, BHV, Санкт-Петербург, 2013.
. # justify gt ;. # justify gt ;. # justify gt; Додаток
Керівництво користувача.
Інтерфейс користувача гранично простий. Для запуску необхідно вибрати виконуваний файл Project.exe і відкрити додаток. При цьому відкриється порожня командний рядок.
У тому випадку, якщо комп'ютер або сервер не підключений до локальної мережі, тобто пакети не надходять, програма нічого не відобразить.
У разі якщо мережеве підключення є, на екрані почнуть з'являтися статистичні дані у вигляді окремих рядків, відповідних прийшов пакету. Кожен рядок показує:
) IP адреса відправника
) IP адреса одержувача
) Протокол передачі
) Розмір пакету, що прийшов
) Час життя пакету
Аналізуючи дані показники можна зробити висновок про розподіл трафіку йде та відправляється.
Вихід з програми здійснюється шляхом натискання будь-якої клавіші на клавіатурі або за допомогою миші.
Малюнок 3.1. Зовнішній вигляд програми.
Тест програми
# include lt; conio.h gt;
# include lt; stdio.h gt;
# include lt; winsock2.h gt;
# define MAX_PACKET_SIZE 0x10000
# define SIO_RCVALL 0x98000001
//Буфер для прийому даних
char Buffer [MAX_PACKET_SIZE];// 64 Kb
//Структура заголовка IP-пакетаstruct IPHeader {
UCHAR iph_verlen;// Версія і довжина заголовкаiph_tos;// Тип сервісаiph_length;// Довжина всього пакетаiph_id;// Ідентіфікаціяiph_offset;// Прапори і смещеніяiph_ttl;// Час життя пакетаiph_protocol;// Протоколiph_xsum;// Контрольна суммаiph_src;// IP-адреса отправітеляiph_dest;// IP-адресу призначення
} IPHeader; src [10]; dest [10]; ds [15]; short lowbyte; short hibyte; main ()
{wsadata;// Ініціалізація WinSock.s;// Cлущающій сокет.
char name [128];// Ім'я хоста (комп'ютера). * Phe;// Інформація про хості.
SOCKADDR_IN sa;// Адреса хоста_ADDR sa1;// long flag=1;// Прапор PROMISC Вкл/викл.
//ініціалізація (MAKEWORD (2,2), amp; wsadata);=socket (AF_INET, SOCK_RAW, IPPROTO_IP); (name, sizeof (name));=gethostbyname (name); ( amp; sa, sizeof (sa)) ;. sin_family=AF_INET; .sin_addr.s_addr=((struct in_addr *) phe- gt; h_addr_list [0]) - gt; s_addr; (s, (SOCKADDR *) amp; sa , sizeof (SOCKADDR));
//Включення в режим прослуховування (s, SIO_RCVALL, amp; flag);
//Нескінченний цикл прийому IP-пакетів.
while (! kbhit ())
{count;=recv (s, Buffer, sizeof (Buffer), 0);
//обробка IP-пакета (count gt;=sizeof (IPHeader))
{* hdr=(IPHeader *) Buffer; (hdr- gt; iph_ttl!=128)
{
//Розбір пакета (src, Пакет: );
CharToOem (src, dest); (dest);
//Перетворимо в зрозумілий вид адреса відправника.
printf ( From ) ;. s_addr=hdr- gt; iph_src;
printf (inet_ntoa (sa1));
//Перетворимо в зрозумілий вид адресу одержувача.
printf ( To ) ;. s_addr=hdr- gt; iph_dest; (inet_ntoa (sa1));
//Обчислюємо протокол. Повний список цих констант
//міститься у файлі winsock2.h
printf ( Prot: ); (hdr- gt; iph_protocol == IPPROTO_TCP) printf ( TCP ); (hdr- gt; iph_protocol == IPPROTO_UDP) printf ( laquo ; UDP );
//Обчислюємо розмір. Так як в мережі прийнятий прямий порядок
//байтів, а не протилежний, то прийдется поміняти байти місцями.
printf ( Size: );=hdr- gt; iph_length gt; gt; 8;=hdr- gt; iph_length lt; lt; 8;=hibyte + lowbyte;
printf (% u raquo ;, hibyte);
//Обчислюємо час життя пакета.
printf ( TTL:% s n , itoa (hdr- gt; iph_ttl, , 10));
} (s); ();
}