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