2009-02-03 2 views
1

У меня есть следующие две колонки: трансляция адресов, основанных на IP и маску подсети с MySQL

 
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

Любая помощь будет оценена.

ответ

3

Широковещательный адрес является дополнением к маске подсети, OR'ed с IP-адресом.

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

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

+0

большими. Спасибо за быстрый ответ. – salparadise

Смежные вопросы