0

カーネルモジュールを作成していますが、宛先アドレスと比較する必要があります。これらのアドレスを動的に追加するアドレスの配列があります。アドレスがすでに配列にある場合は削除しますが、含まれていない場合は次に使用可能なインデックスに配置します。

私のコードの抜粋は次のとおりです。

daddr = &udp_hdr(sock_buff)->dest; /* an example address just for comparison purposes */
saddr = &udp_hdr(sock_buff)->source; /* an example address just for comparison purposes */

int compare( __be32 addr1, __be32 addr2 ) {

  addr1[0] = 0xff & add1 >> 24;
  addr1[1] = 0xff & add1 >> 16;
  addr1[2] = 0xff & add1 >> 8;
  addr1[3] = 0xff & add1;

  addr2[0] = 0xff & add2 >> 24;
  addr2[1] = 0xff & add2 >> 16;
  addr2[2] = 0xff & add2 >> 8;
  addr2[3] = 0xff & add2;

  for(i=0; i<4; i++) {
    if(addr1[i]==addr2[i]) {;
      i++;
      if(i==4) {
        return 0;
        break;
      } else return 1;
    }
  }
} 

次に、関数を使用して比較しています

int compare( __be32 addr1, __be32 addr2 ) {

  addr1[0] = 0xff & add1 >> 24;
  addr1[1] = 0xff & add1 >> 16;
  addr1[2] = 0xff & add1 >> 8;
  addr1[3] = 0xff & add1;

  addr2[0] = 0xff & add2 >> 24;
  addr2[1] = 0xff & add2 >> 16;
  addr2[2] = 0xff & add2 >> 8;
  addr2[3] = 0xff & add2;

  for(i=0; i<4; i++) {
    if(addr1[i]==addr2[i]) {;
      i++;
      if(i==4) {
        return 0;
        break;
      } else return 1;
    }
  }
}

ただし、sayを使用して関数を使用して呼び出す

compare((__be32)daddr, (__be32)saddr)

192.168.1.2と192.132.1.2のようなアドレスを比較すると、true(ここでは0)が返され、場合によってはfalse(ここでは1)が返されます。どこが間違っているのですか、それともアドレスを比較するためのより良い方法がありますか?

4

1 に答える 1

1

ブロックが疑わしい場合、iつまりi++ 2回インクリメントすることになります。必要なのはaddr1[i] == addr2[i]else

for(i=0; i<4; i++) {
   if(addr1[i]!=addr2[i]) {;
     return 1;
   }
}
return 0;
于 2012-04-17T01:27:53.933 に答える