您好我有这样的网络掩码,f.e。 255.128.0.0,它是正确的网络掩码,我需要检查它。
int s;
struct in_addr ipvalue;
s = inet_pton(AF_INET, argv[1], &ipvalue);
如果我打印s
我看到33023
二进制形式的女巫是00000000.00000000.10000000.11111111
,但这不等于我的输入网络掩码,所以我可以检查我的网络掩码是否正确或不?现在我通过比较十进制形式的网络掩码和for (int i = 31; i >=0; i--) sm |= (1 << i);
来欺骗它
谢谢。
答案 0 :(得分:2)
如果我打印s我看到33023二进制形式的女巫是00000000.00000000.10000000.11111111
您的问题看起来像字节序问题。
尝试以下方法:
int s;
struct in_addr ipvalue;
s = inet_pton(AF_INET, argv[1], &ipvalue);
s = ntohl(s);
这应该可以解决字节顺序问题。
答案 1 :(得分:0)
inet_pton
以Big endian形式返回转换后的子网掩码。所以你需要将它转换为Little endianness。然后,您将获得实际的子网掩码。
您不应该打印s
,因为转化的返回值存储在s
中。尝试打印ipvalue
的结构成员。 struct in_addr
包含 -
struct in_addr {
unsigned long s_addr;
};
因此,在从网络字节顺序转换为主机字节顺序时,请使用ipvalue.s_addr
!
请尝试以下代码 -
int s,i;
struct in_addr ipvalue;
unsigned long num;
s = inet_pton(AF_INET, argv[1], &ipvalue);
num=ntohl(ipvalue.s_addr); // converts network to host byte order!
for(i=31;i>=0;i--){
if(num&1<<i)
printf("1");
else
printf("0");
}
printf("\n");