【问题标题】:Compare two ip subnet比较两个 ip 子网
【发布时间】:2017-05-16 21:14:36
【问题描述】:

如何判断两个ip是否在同一个子网上? 唯一的输入是IP地址和子网掩码! 使用 C/C++ 计算两个 ip 是否具有相同子网的最佳方法是什么?

【问题讨论】:

  • 你在考试吗?
  • 将掩码应用于IP地址,看看它们是否相同?
  • 谢谢元帅!那么你的意思是在两个网络(ip 子网)之间计算两个ip或xor之间的xor结果

标签: c network-programming ip ipv4 subnet


【解决方案1】:
bool checkForSubnetEquality(in_addr_t ipA, in_addr_t ipB, uint32_t subnetMask) {
   return (ipA & subnetMask) == (ipB & subnetMask);
}

【讨论】:

  • 我请求您为您的答案添加更多上下文。仅代码或仅链接的答案很难理解。如果您可以在帖子中添加更多信息,这将对提问者和未来的读者都有帮助。
【解决方案2】:
typedef unsigned char BYTE;

Bool CheckForSubnetParity(
BYTE[] _In_ iPAddress1, 
BYTE[] _In_ iPAddress2, 
BYTE[] _In_ subNetMask
) {

      BYTE[] NetworkPrefix1 = new BYTE[4];
      BYTE[] NetWorkPrefix2 = new BYTE[4];
      Bool Result = true;

      for ( int x = 0; x < 4; x++) 
      {
          NetworkPrefix1[x] = iPAddress1[x] && subNetMask[x];
          NetworkPrefix2[x] = iPAddress2[x] && subNetMask[x];
          if ( NetworkPrefix1[x] != NetworkPrefix2[x] ) 
          {
              Result = false;
          }
      }

      return Result;
   }

【讨论】:

  • 绝对没有必要为此任务分配内存!而且我认为!= 的优先级高于^,所以这似乎是错误的
  • 你说得对,= 运算符对于同一件事来说要短得多。我专注于如此狭窄的焦点,以至于我完全想念“如何使用平等”......
  • 但我确实喜欢使用 BYTE 数组而不是更大的类型。
  • 这很愚蠢,但如果你坚持至少摆脱堆分配:BYTE NetworkPrefix1[4];
  • 这不仅仅是做同样事情的一种不那么冗长的方式吗?
【解决方案3】:

您可以使用它们的掩码对两个 IP 应用“异或”操作,然后比较它们。如果它们相同,则两个 IP 地址都在同一子网中。

我们看看172.16.2.4/255.255.0.0和172.16.1.69/255.255.0.0 在“异或”之后,您将获得两个地址的“172.16.0.0”,因此它们位于同一个子网中。

问候。

【讨论】:

  • 不应该是AND而不是XOR吗?
猜你喜欢
  • 2014-07-13
  • 2011-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-06
  • 2017-09-24
  • 1970-01-01
  • 2014-04-17
相关资源
最近更新 更多