Читать сырой сокет ip заголовок? C ++

0

Я пытаюсь выяснить, что IP-пакет содержит с использованием сырых сокетов. Я пишу в C++, и до сих пор мне удалось распечатать весь пакет, используя следующий код:

int CreateRawSocket(int protocol_to_sniff)
{
     int s
     if(s = socket(PF_PACKET, SOCK_RAW, htons(protocol_to_sniff)
     {
          perror("Error creating raw socket");
          exit(1);
     }
     return s;
}

void PrintPacket(unsigned char *packet, int len)
{
     unsigned char *p = packet;

     printf("\n--Packet start--\n");
     while(len--)
     {
          printf("%.2x ", *p);
          p++;
     }
     printf("\n--Packet end--\n");
}

int main()
{
     int length, s, packets_to_sniff;
     unsigned char *packet_buffer;

     s = CreateRawSocket(ETH_P_ALL);

     if(s == -1)
     {
           perror("Error creating socket");
           exit(1);
     }

     packet_buffer = (unsigned char *)malloc(1518);

     printf("Number of packets to sniff?: ");
     cin >> packets_to_sniff;

     while(packets_to_sniff--)
     {
           length = recvfrom(s, packet_buffer, ETH_FRAME_LEN, 0, NULL, NULL);
           if(length == -1)
           {
                 perror("Error recieving packet");
                 exit(1);
           }
           else
           {
                 printf("Packet number: " + packets_to_sniff);
                 PrintPacket(packet_buffer, length);
           }
     }
}

У меня есть виртуальная машина, пинговая ту, на которой я программирую, и вся моя программа, похоже, печатает, это кадры MAC пакета, которые, я думаю, находятся в шестнадцатеричном формате.

Я хотел бы иметь возможность прочитать заголовок IP и выяснить, какие поля заголовка содержат какую информацию.

Что-то вроде:

printf(packet_buffer[0]);
printf(packet_buffer[1]);

Я пробовал это, не получая никакого вывода, который кажется странным.

С наилучшими пожеланиями!

Теги:
sockets
hex
raw-sockets

2 ответа

1
Лучший ответ

поскольку вы знаете размер IP-заголовка, вы можете печатать каждый байт как hex:

for (int i = 0; i < ip_header_length; i++)
    printf("%02x ", packet_buffer[i]);
  • 0
    Каков размер заголовка IP?
  • 0
    en.wikipedia.org/wiki/IPv4#Header
Показать ещё 1 комментарий
0

Вы пытались сбросить содержимое пакета_буфера в шестнадцатеричном виде, а не рассматривать его как строку, состоящую из печатных символов?

  • 0
    Я не совсем уверен, что вы имеете в виду?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню