如何验证广播 IP 地址?

Posted

技术标签:

【中文标题】如何验证广播 IP 地址?【英文标题】:How to validate broadcast IP addresses? 【发布时间】:2013-04-16 08:08:31 【问题描述】:

我想验证广播和多播 IP 地址,即我正在使用的两个 IP 地址:255.255.255.0229.0.0.20

我想在输入多播或广播 IP 时发出警报。

以下代码适用于多播地址,但如何验证广播地址?

[ 
  'validate-mcast-ip',
  'Please enter a valid multicast IP in this field.',
  function(v) 
    if (v == "") return true;
    if (v == "0.0.0.0") return false;

    ipPattern = /^(\d1,3)\.(\d1,3)\.(\d1,3)\.(\d1,3)$/;
    ipArray = v.split(".");
    isIP = ipPattern.test(v);
    if (isNaN(ipArray[0]) || ipArray[0] < 224 || ipArray[0] > 239) 
        isIP = false;
    
    for (i = 1; i < ipArray.length; i++) 
        if (isNaN(ipArray[i]) || ipArray[i] > 255) 
        isIP = false;
        
    
    return isIP;
  
]

【问题讨论】:

以上代码适用于多播 ip 但我如何验证广播地址 请看这段代码的braod case if(isNaN(ipArray[0]) || ipArray[0] 239) isIP = false; 【参考方案1】:

那么你到底想做什么呢?你正在检查 IP(你已经解析成一个包含四个项目的数组)是否符合你设置的一些限制。假设您希望只允许 224.0.0.0 和 239.255.255.255(含)之间的所有 IP 地址,这两个地址 225.225.225.0 和 229.0.0.20(就像你最初说)。你是怎么做到的?

首先,您检查 IP 是否在 224.0.0.0 和 239.255.255.255 之间。为此,人们可以很容易地看到只需要检查第一个数字。因此:

if(ipArray[0]<224||ipArray[0]>239)
    return false;

但是等等:如果 IP 地址是 225.225.225.0 或 229.0.0.20,我们应该返回 false!所以我们最后的代码 sn-p 变成了:

if((ipArray[0]<224||ipArray[0]>239)&&v!="255.255.255.0"&&v!="229.0.0.20")
    return false;

请注意,条件开头的|| 部分是“带括号的”(因为没有更好的词)。这是因为如果我们不这样做,javascript 解释器会认为我们的意思是:

if(ipArray[0]<224||(ipArray[0]>239&&v!="255.255.255.0"&&v!="229.0.0.20"))
    return false;

这是因为&amp;&amp; 运算符的precedence 比|| 运算符更高。

现在,利用我们新发现的知识,让我们重写您的原始代码:

function (v) 
    if(v=="") return true;
    if(v=="0.0.0.0") return false;

    if(!v.match(/^(\d1,3)\.(\d1,3)\.(\d1,3)\.(\d1,3)$/)) return false;
    ipArray = v.split(".");
    //We don't need to check for NAN anymore because it matched your
    //beautiful regex above
    if((ipArray[0]<224||ipArray[0]>239)&&v!="255.255.255.0"&&v!="229.0.0.20")
        return false;
    return true; //if we've reached this point, the IP conforms to the restrictions!

您的问题得到解答了吗?如果是这样,请不要忘记帮助 Stack Overflow 并将此答案标记为已接受(绿色复选标记)!

【讨论】:

是的,我想要什么......让我试试上面的代码,我可以为 ip 225.225.225.0 抛出错误,但不会为 229.0.0.20 抛出错误 if(isNaN(ipArray[0]) || ipArray[0] 239 && v!="225.225.225.0" && v!="229.0.0.20 ") isIP = false;这是我尝试过的,但如果 229.0.0.20 它没有显示错误...但它应该抛出一个错误 不要忘记额外的括号...使用if((isNAN(ipArray[0])||ipArray[0]&lt;224||ipArray[0]&gt;239)&amp;&amp;v!="225.225.225.0"&amp;&amp;v!="229.0.0.20")作为你的if语句。看看这是否有效。 (先打字错误) 是的,我已经正确地编写了它,但是为什么这段代码不起作用我不知道 if((isNaN(ipArray[0])239) && v!=" 225.225.225.0" && v!="229.0.0.20") isIP=false; 请复制粘贴我的代码,而不是重新输入。您提供的代码不正确,请查看isNAN(ipArray[0])||ipArray[0]&lt;224 位。另外,请在反引号之间放置代码,例如 `this`(变为 this)。 (不是撇号,而是键盘上实际指向左侧的撇号)【参考方案2】:

简单”正则表达式,例如 /^(2(?:2[4-9]|3[0-9]))\.([0-2]?[0-9]?[0-9])\.([0-2]?[0-9]?[0-9])\.([0-2]?[0-9]?[0-9])$/g,应该完全符合您的要求。

function validateMulticastIP(ip) 
    return !!ip.match(/^(2(?:2[4-9]|3[0-9]))\.([0-2]?[0-9]?[0-9])\.([0-2]?[0-9]?[0-9])\.([0-2]?[0-9]?[0-9])$/g);

validateMulticastIP('2.3.5.6'); //false
validateMulticastIP('2'); //false
validateMulticastIP('230.3.5.6'); //true
validateMulticastIP('255.255.255.0'); //false
validateMulticastIP('229.0.0.20'); //true

Regex101 Demo

【讨论】:

“简单的正则表达式”,你想骗谁? (我开玩笑,我开玩笑)。 如果您正在测试单个字符串值,则不需要/g, (global), 选项。

以上是关于如何验证广播 IP 地址?的主要内容,如果未能解决你的问题,请参考以下文章

使用 boost::asio 获取广播源 IP 地址

单播、广播和多播IP地址

IP地址

IP地址

有限广播地址与直接广播地址

Python netifaces给出了两个地址