Network programming 从nfq获取数据\u获取\u有效负载
当我使用'nfq_get_payload(nfqData和data);'然后打印“数据”,我得到的都是E,我还应该做些什么来获取有效载荷Network programming 从nfq获取数据\u获取\u有效负载,network-programming,packet,packet-capture,packets,netfilter,Network Programming,Packet,Packet Capture,Packets,Netfilter,当我使用'nfq_get_payload(nfqData和data);'然后打印“数据”,我得到的都是E,我还应该做些什么来获取有效载荷 ret = nfq_get_payload(nfqData, &data); if (ret >= 0) printf("payload_len=%d \nPayload: %s", ret, data); 数据参数的类型为char**,在本例中,我们可以将其视为指向字符列表的指针。该调用将数据设
ret = nfq_get_payload(nfqData, &data);
if (ret >= 0)
printf("payload_len=%d \nPayload: %s", ret, data);
数据参数的类型为char**,在本例中,我们可以将其视为指向字符列表的指针。该调用将数据设置为数据包的字符列表。但是,即使“c字符串”也是char*类型,此处返回的数据也不是c字符串,因为它具有嵌入的空值。如果您尝试使用%s打印它,您将只获得第一个空值的数据 我打赌你得到的是IP数据包,因为a的第一个字节几乎总是0x45,在ASCII中是字母“E”。如果后跟TOS字段,则该字段几乎总是0或NULL。这个0x45,0x00是一个有效的c字符串,这就是为什么要得到一个E 您确实希望使用返回值ret作为循环计数器并打印数据包的每个字节:
for (int i = 0; i < ret; i++) {
printf(" 0x%1X ", data[i] );
}
for(int i=0;i
查看打印缓冲区的讨论。数据参数的类型为char**,在本例中,我们可以将其视为指向char列表的指针。该调用将数据设置为数据包的字符列表。但是,即使“c字符串”也是char*类型,此处返回的数据也不是c字符串,因为它具有嵌入的空值。如果您尝试使用%s打印它,您将只获得第一个空值的数据 我打赌你得到的是IP数据包,因为a的第一个字节几乎总是0x45,在ASCII中是字母“E”。如果后跟TOS字段,则该字段几乎总是0或NULL。这个0x45,0x00是一个有效的c字符串,这就是为什么要得到一个E 您确实希望使用返回值ret作为循环计数器并打印数据包的每个字节:
for (int i = 0; i < ret; i++) {
printf(" 0x%1X ", data[i] );
}
for(int i=0;i
有关打印缓冲区的讨论,请参阅