「nfq_get_payload(nfqData, &data);」を使用する場合 そして、「データ」を出力します。得られるのはEだけです。ペイロードを取得するために他に何かする必要がありますか?
ret = nfq_get_payload(nfqData, &data);
if (ret >= 0)
printf("payload_len=%d \nPayload: %s", ret, data);
「nfq_get_payload(nfqData, &data);」を使用する場合 そして、「データ」を出力します。得られるのはEだけです。ペイロードを取得するために他に何かする必要がありますか?
ret = nfq_get_payload(nfqData, &data);
if (ret >= 0)
printf("payload_len=%d \nPayload: %s", ret, data);
data パラメーターは char** 型で、この場合は char のリストへのポインターと考えることができます。この呼び出しは、データをパケットの文字のリストに設定します。ただし、「C 文字列」も char* 型ですが、ここで返されるデータは null が埋め込まれているため、C 文字列ではありません。%s で出力しようとすると、最初の null までのデータしか得られません。
IP パケット ヘッダーの最初のバイトはほぼ常に 0x45 であり、ASCII では文字 'E' であるため、IP パケットを取得していることは間違いありません。これに TOS フィールドが続く場合、ほとんどの場合 0 または NULL です。この 0x45,0x00 は有効な c-string であり、E を取得する理由です。
戻り値 ret をループ カウンターとして使用し、パケットの各バイトを出力する必要があります。
for (int i = 0; i < ret; i++) {
printf(" 0x%1X ", data[i] );
}
16進数を印刷するときにprintfが1バイトだけを印刷しないのはなぜですか?印刷バッファーの説明については。