【问题标题】:Check is netmask correct检查网络掩码是否正确
【发布时间】:2014-08-08 09:43:02
【问题描述】:

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

【问题讨论】:

  • 在此上下文中定义“正确”。你是什​​么意思“不等于我的输入IP”?网络掩码不应等于任何 ip。
  • 我的意思是网络掩码,正确的是所有1位相互跟随,我的意思是,网络掩码不能是10.0.0.1
  • 但是网络掩码可以是 255.128.0.0。因此,您输出网络掩码可能就像它只是一个正常数字一样可能是这里的问题。该网络掩码更好地表示为 11111111.10000000.00000000.00000000
  • 是的,但 inet_pton 会返回通配符符号

标签: c network-programming netmask


【解决方案1】:

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

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

尝试以下方法:

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

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

【讨论】:

    【解决方案2】:

    无论你做了什么,都是正确的!但是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");
    

    【讨论】:

      猜你喜欢
      • 2010-12-31
      • 2020-12-14
      • 2016-12-27
      • 2012-04-22
      • 2010-10-09
      • 2023-04-03
      • 2010-10-30
      • 1970-01-01
      • 2023-03-17
      相关资源
      最近更新 更多