1

「nfq_get_payload(nfqData、&データ)を使用すると、それから、 'データ'を印刷して、私が得るのはEです。ペイロードを取得するために何か他のものがありますか?nfq_get_payloadからデータを取得する

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

答えて

1

データパラメータの型はchar **です。この場合、char型のリストへのポインタと考えることができます。コールは、データをパケットの文字のリストに設定します。しかし、たとえ "c string"もchar *型であっても、ここに返されるデータはNULLが埋め込まれているため、c-stringではありません。 %sで印刷しようとすると、最初のヌルまでしかデータが得られません。

IP packet headerの最初のバイトはほぼ常に0x45で、ASCIIでは文字 'E'であるため、IPパケットが届いていると思います。これに続いてTOSフィールドが続きます。ほとんどの場合、0またはNULLです。この0x45,0x00は有効なC-文字列であり、あなたはE.に

を取得しているなぜあなたは本当にループカウンタや印刷などのパケットの各バイトを戻り値、RETを、使用したいされています

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

バッファの印刷については、Why does printf not print out just one byte when printing hex?を参照してください。