0

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

4

2 回答 2

2

如果我打印 si 看到二进制形式的 33023 女巫是 00000000.00000000.10000000.11111111

您的问题看起来像字节顺序问题。

尝试以下操作:

int s; 
struct in_addr ipvalue;
s = inet_pton(AF_INET, argv[1], &ipvalue);
s = ntohl(s);

那应该可以解决字节顺序问题。

于 2014-08-08T10:06:49.743 回答
0

不管你做了什么,都是正确的!但inet_pton以大端形式返回转换后的子网掩码。所以你需要将它转换为小端序。然后你会得到你的实际子网掩码。

而且您不应该打印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");
于 2014-08-08T10:32:09.700 回答