Читать сырой сокет ip заголовок? Переполнение стека

Я пытаюсь выяснить, что содержит 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]);

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

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

0

Решение

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

for (int i = 0; i < ip_header_length; i++)
printf("%02x ", packet_buffer[i]);
1

Другие решения

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

0

По вопросам рекламы [email protected]