基于IP和子网掩码的广播地址与mysql

时间:2009-02-03 21:23:19

标签: mysql subnet

我有以下两列:

SELECT  b.ip_address AS IP ,b.mask AS MASK FROM interfaces b WHERE b.ip_address = 167804290;
+-----------+------------+
| IP        | MASK       |
+-----------+------------+
| 167804290 | 4294967168 | 
+-----------+------------+
实际IP地址在哪里是其子网掩码
SELECT INET_NTOA(b.ip_address) AS IP,INET_NTOA(b.mask) AS MASK FROM interfaces b WHERE b.ip_address = 167804290;
+--------------+-----------------+ | IP | MASK | +--------------+-----------------+ | 10.0.125.130 | 255.255.255.128 | +--------------+-----------------+ 1 row in set (0.00 sec)
我试图找到一种方法用mysql来获取实际广播范围,在这种情况下是10.0.125.255167804415,但我看不到它。 我最接近的是

SELECT INET_NTOA(b.ip_address+(POWER(2,32)- b.mask - 1)) FROM interfaces b WHERE b.ip_address = 167804290; 
+---------------------------------------------------+
| INET_NTOA(b.ip_address+(POWER(2,32)- b.mask - 1)) |
+---------------------------------------------------+
| 10.0.126.1                                        | 
+---------------------------------------------------+

唯一的问题是,假设列ip_address是子网的开头10.0.125.128

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

广播地址是子网掩码的补充,与IP地址进行“或”运算。

SELECT INET_NTOA( ~b.mask & 0xffffffff | b.ip_address) 
FROM interfaces b 
WHERE b.ip_address = 167804290; 

(你必须使用“& 0xffffffff”进行掩码,因为在MySQL中,按位补码运算符返回64位值。)