Advertisement
VladimirKostovsky

Osi_Lab4

Dec 18th, 2023 (edited)
980
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.24 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <iostream>
  3. #include<stdio.h>
  4. #include<stdlib.h>
  5. #include <WinSock.h>
  6. #pragma comment (lib,"Ws2_32.lib")
  7.  
  8. void print_MACADDR(FILE* out, char* MAC)
  9. {
  10.     int i;
  11.     for (i = 0; i < 5; i++)
  12.         fprintf(out, "%02X:", (unsigned char)MAC[i]);
  13.     fprintf(out, "%02X\n", (unsigned char)MAC[i]);
  14. }
  15.  
  16.  
  17. void print_IPADDR(FILE* out, char* IP)
  18. {
  19.     int i;
  20.     for (i = 0; i < 3; i++)
  21.         fprintf(out, "%d.", (unsigned char)IP[i]);
  22.     fprintf(out, "%d\n", (unsigned char)IP[i]);
  23. }
  24.  
  25. void main()
  26. {
  27.     setlocale(LC_ALL, "Rus");
  28.     FILE* in = NULL;
  29.     FILE* out = NULL;
  30.  
  31.     char fname[15];
  32.     int fsize = 0;
  33.  
  34.     bool file = false;
  35.     while (!file)
  36.     {
  37.         printf("Имя файла: ");
  38.         scanf("%s", &fname);
  39.         in = fopen(fname, "rb");
  40.         if (in != NULL)
  41.             file = true;
  42.         else
  43.             printf("Ошибка\n");
  44.     }
  45.     out = fopen("out.txt", "w");
  46.  
  47.     fseek(in, 0, SEEK_END);     // указатель в конец файла
  48.     fsize = ftell(in);          // позиция указателя =  размер файла
  49.     fseek(in, 0, SEEK_SET);     // указатель в начало файла
  50.     fprintf(out, "Размер файла: %d байт", fsize);
  51.     fprintf(out, "\n");
  52.  
  53.     char* DATA = new char[fsize]; // массив с данными фрейма
  54.     fread(DATA, fsize, 1, in);
  55.     fclose(in);
  56.  
  57.     char* d = DATA;
  58.     int frames = 1;
  59.     size_t type_count[5]{};
  60.     while (d < DATA + fsize)
  61.     {
  62.         fprintf(out, "Фрейм: %d\n", frames);
  63.         fprintf(out, "MAC-адрес получателя: ");
  64.         print_MACADDR(out, d); // 6 байтов - адрес назначения
  65.  
  66.         fprintf(out, "MAC-адрес отправителя: ");
  67.         print_MACADDR(out, d + 6); // слудйющие 6 байтов - адрес получателя
  68.         unsigned short type = ntohs(*(unsigned short*)(d + 12)); // тип фрейма
  69.         if (type == 0x800) //если тип фрейма - IPv4
  70.         {
  71.             fprintf(out, "Тип фрейма: IPv4\n");
  72.             fprintf(out, "IP-адрес отправителя: ");
  73.             print_IPADDR(out, d + 26);
  74.             fprintf(out, "IP-адрес получателя: ");
  75.             print_IPADDR(out, d + 30);
  76.  
  77.             type = ntohs(*(unsigned short*)(d + 16)) + 14;
  78.             fprintf(out, "\n");
  79.             d += type;
  80.             frames++;
  81.             type_count[0]++;
  82.         }
  83.         else
  84.         {
  85.             if (type > 0x05DC)
  86.             {
  87.                 fprintf(out, "Тип фрейма: Ethernet DIX (II)\n");
  88.                 type_count[1]++;
  89.             }
  90.             else
  91.                 if (type <= 0x05DC)
  92.                 {
  93.                     unsigned short F = ntohs(*(unsigned short*)(d + 14)); // первые 2 байта поля данных
  94.                     if (F == 0xFF)
  95.                     {
  96.                         fprintf(out, "Тип фрейма: Novell 802.3 (Ethernet 802.3)\n");
  97.                         type_count[2]++;
  98.                     }
  99.                     else
  100.                         if (F == 0xAA)
  101.                         {
  102.                             fprintf(out, "Тип фрейма: Ethernet SNAP\n"); // стандартный расширенный формат 802.2
  103.                             type_count[3]++;
  104.                         }
  105.                         else
  106.                         {
  107.                             fprintf(out, "Тип фрейма: 802.3/LLC (Ethernet 802.2)\n"); // стандартный обычный формат 802.2
  108.                             type_count[4]++;
  109.                         }
  110.                 }
  111.             fprintf(out, "\n-------------------------------\n");
  112.             d += type + 14;
  113.             frames++;
  114.         }
  115.     }
  116.     fprintf(out, "Общее число фреймов: %d\n", frames - 1);
  117.     fprintf(out, "IPv4: %d\n", type_count[0]);
  118.     fprintf(out, "Ethernet DIX (II): %d\n", type_count[1]);
  119.     fprintf(out, "Ethernet 802.3: %d\n", type_count[2]);
  120.     fprintf(out, "Ethernet SNAP: %d\n", type_count[3]);
  121.     fprintf(out, "Ethernet 802.2: %d\n", type_count[4]);
  122.     fclose(out);
  123.     system("pause");
  124. }
  125.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement