私は次のコードを持っています
int ParseData(unsigned char * packet、int len){struct ethhdr * ethernet_header; struct iphdr * ip_header; struct tcphdr * tcp_header; unsigned char * data; 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){printf(mesg);
while(len--)
{
if(isprint(*p))
printf("%c", *p);
else
printf(".");
p++;
}
}
コードは見栄えが良く、コンパイルの問題や警告はありません。問題は、最初のペイロード文字が位置0ではなく、12バイト後に印刷されることです。
すべての「len」バイトは、印刷する必要のある正確なデータだと思いました。
データのデータポイント=(packet + sizeof(struct ethhdr)+ ip_header-> ihl * 4 + sizeof(struct tcphdr)); ただし、data[0]は印刷できません。何が問題ですか?私は何かが恋しいですか?TCPオプションの部分をチェックする必要がありますか?
ありがとう