检查网络掩码是否正确

时间:2014-08-08 09:43:03

标签: c network-programming netmask

您好我有这样的网络掩码,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);来欺骗它 谢谢。

2 个答案:

答案 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");