У меня есть следующий код
int ParseData (неподписанный пакет char *, int len)
{
struct ethhdr * ethernet_header;
struct iphdr * ip_header;
struct tcphdr * tcp_header;
данные без знака *;
int data_len;
/* Check if any data is there */
if(len > (sizeof(struct ethhdr) + sizeof(struct iphdr) + sizeof(struct tcphdr)))
{
ip_header = (struct iphdr*)(packet + sizeof(struct ethhdr));
data = (packet + sizeof(struct ethhdr) + ip_header->ihl*4 + sizeof(struct tcphdr));
data_len = ntohs(ip_header->tot_len) - ip_header->ihl*4 - sizeof(struct tcphdr);
if(data_len)
{
printf("Data Len : %d\n", data_len);
PrintData("Data : ", data, data_len);
printf("\n\n");
return 1;
}
else
{
printf("No Data in packet\n");
return 0;
}
}
}
Я пытаюсь напечатать в ASCII полезную нагрузку и с помощью простой функции, подобной этой
PrintData (char * mesg, unsigned char * p, int len)
{
Е (MESG); * +1010 *
while(len--)
{
if(isprint(*p))
printf("%c", *p);
else
printf(".");
p++;
}
}
Код выглядит хорошо, нет проблем с компиляцией / предупреждение. Проблема в том, что первая полезная нагрузка
символ печатается не в позиции 0, а через 12 байт.
Я думал, что все байты "len" - это точные данные, которые я должен напечатать.
Мои данные указывают на
data = (пакет + sizeof (struct ethhdr) + ip_header-> ihl * 4 + sizeof (struct tcphdr));
Однако данные [0] не для печати. В чем проблема? Я что-то пропустил? Должен ли я проверить часть параметров TCP, возможно?
Спасибо