2

ネットフィルターですべての着信パケットを受信するモジュールを作成しました。/ var / log / messagesにデータ(ヘッダーなし)を出力したい。次のprintk行を試しましたが、適切なメッセージが出力されません。

 struct sk_buff *sock_buff; 
 printk(KERN_INFO"user data :: %x",(sock_buff->data+sizeof(*sock_buff->network_header)+sizeof(*sock_buff->mac_header))  //though i want in character but i cant understand whats it printing not matching the hex of my data
  printk(KERN_INFO"user data :: %s",(sock_buff->data+sizeof(*sock_buff->network_header)+sizeof(*sock_buff->mac_header))

私もtailを使用しました--sizeof(my_data); それからまた私は望ましいo/pを得ていません。

4

2 に答える 2

2

たぶんあなたはポインタ(*)で値を取るのを忘れたので、これを試してください

printk(KERN_INFO"user data :: %x",*(sock_buff->data+sizeof(*sock_buff->network_header) +sizeof(*sock_buff->mac_header));  

私が理解しているように、構造データフィールドにはポインタ型があります。

typedef struct{
  ...
  unsigned char* data;
  ...
} sk_buff;

また、%x指定子(16進数の数値)は、ポインターではなく数値の集計を要求します。そのため、小さな(*)を1つ入力することを忘れないでください。

于 2012-04-27T08:00:49.257 に答える
-1

私はカーネルハッカーではありませんが、skbuff.hヘッダーファイルを見ると、ヘッダーの後のデータの1つsock_buff->dataまたはsock_buff->tailがデータを指しているように見えます。その場合printk(KERN_INFO"user data :: %s",sock_buff->data);はうまくいくかもしれません。

于 2012-04-27T08:38:02.907 に答える