将IP地址与C编程进行比较

时间:2011-03-25 15:27:56

标签: c

友 我想比较2个IP地址,这样我可能会比另一个更加/更“特定”或“受限制”。 那么有没有任何函数/库可以帮助在C中进行这种比较(在Ubuntu 10.10上)?

再见

1 个答案:

答案 0 :(得分:1)

如果两个IP地址都是字符串形式,我会使用strtok()将每个(IPv4)IP地址分成四个子串,并通过子串比较两个IP地址子串,因此:

  char ipaddr1[16] = "192.168.1.1';      
  char ipaddr2[16] = "127.0.0.1';

变为:

  char ipaddr1_byte0[4] = "192";
  char ipaddr1_byte1[4] = "168";
  char ipaddr1_byte2[4] = "1";
  char ipaddr1_byte3[4] = "1";

  char ipaddr2_byte0[4] = "127";
  char ipaddr2_byte1[4] = "0";
  char ipaddr2_byte2[4] = "0";
  char ipaddr2_byte3[4] = "1";

似乎应该能够使用

  same = strcmp( ipaddr1_byte0, ipaddr2_byte0 );

和所有四对类似,但你可能必须通过在每个八个字节值上调用atoi()将每个字节转换为int;然后比较整数。

如果(IPv4)IP地址是int形式,那么过程是类似的,除了四个子串必须转换为8位整数,而不是字符串:

  int ipaddr1 = 0xc0a80101;     // 192.168.1.1      
  int ipaddr2 = 0xff000001;     // 127.0.0.1

变为:

  int ipaddr1_byte0 = 0xff & ipaddr1 >> 24; // 192 or 0xc0 
  int ipaddr1_byte1 = 0xff & ipaddr1 >> 16; // 168 or 0xa8
  int ipaddr1_byte2 = 0xff & ipaddr1 >>  8; //   1
  int ipaddr1_byte3 = 0xff & ipaddr1;       //   1

  int ipaddr2_byte0 = 0xff & ipaddr1 >> 24; // 127 or 0xff
  int ipaddr2_byte1 = 0xff & ipaddr1 >> 16; //   0
  int ipaddr2_byte2 = 0xff & ipaddr1 >>  8; //   0
  int ipaddr2_byte3 = 0xff & ipaddr1;       //   1

这些8位字节中的每一个都必须与所有其他三个字节分开处理,并与IP地址分开处理为32位int。 IOW,不要以为你可以用这种方式建立IP地址:

  int ipaddr1 = 192168001001;  // DOES NOT WORK

因为它不起作用

相反,你必须这样做:

  int ipaddr1 = (192 << 24) | (168 << 16) | (1 << 8) | 1;  // don't add these; inclusive-or them together

- 皮特