1

When I use 'nfq_get_payload(nfqData, &data);' and then print 'data', all I get are E's, is there something else that I should be doing to get the payload?

        ret = nfq_get_payload(nfqData, &data);
    if (ret >= 0)
            printf("payload_len=%d \nPayload: %s", ret, data);
4

1 回答 1

1

data 参数是 char** 类型,在这种情况下,我们可以将其视为指向字符列表的指针。该调用将数据设置为数据包的字符列表。然而,即使“c 字符串”也是 char* 类型,此处返回的数据也不是 c 字符串,因为它嵌入了空值。如果您尝试使用 %s 打印它,您将只能获取到第一个空值的数据。

我敢打赌你会收到一个 IP 数据包,因为IP 数据包头的第一个字节几乎总是 0x45,在 ASCII 中是字母“E”。如果后面跟着一个 TOS 字段,该字段几乎总是 0 或 NULL。这个 0x45,0x00 是一个有效的 c 字符串,这就是你得到 E 的原因。

您确实想使用返回值 ret 作为循环计数器并打印数据包的每个字节:

for (int i = 0; i < ret; i++) {
   printf(" 0x%1X ", data[i] );
}

看看为什么 printf 在打印十六进制时不只打印一个字节?讨论打印缓冲区。

于 2012-05-25T16:54:33.430 回答