Широковещательный адрес на основе IP и маски подсети с MySQL - PullRequest
1 голос
/ 04 февраля 2009

У меня есть следующие две колонки:

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.255 или 167804415, но я не могу его найти. самый близкий, который я получил, является

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 Ответ

3 голосов
/ 04 февраля 2009

Широковещательный адрес является дополнением маски подсети ИЛИ с IP-адресом.

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

(Вы должны маскировать с помощью "& 0xffffffff", потому что в MySQL оператор побитового дополнения возвращает 64-битное значение.)

...