Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include <iostream>
- #include<stdio.h>
- #include<stdlib.h>
- #include <WinSock.h>
- #pragma comment (lib,"Ws2_32.lib")
- void print_MACADDR(FILE* out, char* MAC)
- {
- int i;
- for (i = 0; i < 5; i++)
- fprintf(out, "%02X:", (unsigned char)MAC[i]);
- fprintf(out, "%02X\n", (unsigned char)MAC[i]);
- }
- void print_IPADDR(FILE* out, char* IP)
- {
- int i;
- for (i = 0; i < 3; i++)
- fprintf(out, "%d.", (unsigned char)IP[i]);
- fprintf(out, "%d\n", (unsigned char)IP[i]);
- }
- void main()
- {
- setlocale(LC_ALL, "Rus");
- FILE* in = NULL;
- FILE* out = NULL;
- char fname[15];
- int fsize = 0;
- bool file = false;
- while (!file)
- {
- printf("Имя файла: ");
- scanf("%s", &fname);
- in = fopen(fname, "rb");
- if (in != NULL)
- file = true;
- else
- printf("Ошибка\n");
- }
- out = fopen("out.txt", "w");
- fseek(in, 0, SEEK_END); // указатель в конец файла
- fsize = ftell(in); // позиция указателя = размер файла
- fseek(in, 0, SEEK_SET); // указатель в начало файла
- fprintf(out, "Размер файла: %d байт", fsize);
- fprintf(out, "\n");
- char* DATA = new char[fsize]; // массив с данными фрейма
- fread(DATA, fsize, 1, in);
- fclose(in);
- char* d = DATA;
- int frames = 1;
- size_t type_count[5]{};
- while (d < DATA + fsize)
- {
- fprintf(out, "Фрейм: %d\n", frames);
- fprintf(out, "MAC-адрес получателя: ");
- print_MACADDR(out, d); // 6 байтов - адрес назначения
- fprintf(out, "MAC-адрес отправителя: ");
- print_MACADDR(out, d + 6); // слудйющие 6 байтов - адрес получателя
- unsigned short type = ntohs(*(unsigned short*)(d + 12)); // тип фрейма
- if (type == 0x800) //если тип фрейма - IPv4
- {
- fprintf(out, "Тип фрейма: IPv4\n");
- fprintf(out, "IP-адрес отправителя: ");
- print_IPADDR(out, d + 26);
- fprintf(out, "IP-адрес получателя: ");
- print_IPADDR(out, d + 30);
- type = ntohs(*(unsigned short*)(d + 16)) + 14;
- fprintf(out, "\n");
- d += type;
- frames++;
- type_count[0]++;
- }
- else
- {
- if (type > 0x05DC)
- {
- fprintf(out, "Тип фрейма: Ethernet DIX (II)\n");
- type_count[1]++;
- }
- else
- if (type <= 0x05DC)
- {
- unsigned short F = ntohs(*(unsigned short*)(d + 14)); // первые 2 байта поля данных
- if (F == 0xFF)
- {
- fprintf(out, "Тип фрейма: Novell 802.3 (Ethernet 802.3)\n");
- type_count[2]++;
- }
- else
- if (F == 0xAA)
- {
- fprintf(out, "Тип фрейма: Ethernet SNAP\n"); // стандартный расширенный формат 802.2
- type_count[3]++;
- }
- else
- {
- fprintf(out, "Тип фрейма: 802.3/LLC (Ethernet 802.2)\n"); // стандартный обычный формат 802.2
- type_count[4]++;
- }
- }
- fprintf(out, "\n-------------------------------\n");
- d += type + 14;
- frames++;
- }
- }
- fprintf(out, "Общее число фреймов: %d\n", frames - 1);
- fprintf(out, "IPv4: %d\n", type_count[0]);
- fprintf(out, "Ethernet DIX (II): %d\n", type_count[1]);
- fprintf(out, "Ethernet 802.3: %d\n", type_count[2]);
- fprintf(out, "Ethernet SNAP: %d\n", type_count[3]);
- fprintf(out, "Ethernet 802.2: %d\n", type_count[4]);
- fclose(out);
- system("pause");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement