我有以下代码
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”字节都是我必须打印的确切数据。
我的数据指向 data =(packet + sizeof(struct ethhdr)+ ip_header-> ihl * 4 + sizeof(struct tcphdr)); 但是数据[0]不可打印。问题是什么?我错过了什么吗?我是否必须检查TCP选项部分?
由于
答案 0 :(得分:0)
没错,添加sizeof(struct tcphdr)只会让你超越标题,而不是选项。要获取实际数据,您应该使用TCP标头中的“偏移”字段。偏移量是从TCP报头的起始位置计算出来的,并且是以4字节为单位的,例如,如果偏移量为8,则标题+选项长度为32。