2009-02-03 6 views
1

je les deux colonnes suivantes: Adresse de diffusion basée sur IP et le masque de sous-réseau avec MySQL

 
SELECT b.ip_address AS IP ,b.mask AS MASK FROM interfaces b WHERE b.ip_address = 167804290; 
+-----------+------------+ 
| IP  | MASK  | 
+-----------+------------+ 
| 167804290 | 4294967168 | 
+-----------+------------+ 
Où se trouve une adresse IP réelle d'un son masque de sous-réseau
 
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)
Je suis en train de trouver un moyen avec MySQL pour saisir la diffusion réelle plage qui dans ce cas est 10.0.125.255 ou 167804415, mais je ne peux pas voir pour le trouver. le plus proche est que je Gotten

 
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          | 
+---------------------------------------------------+ 

seul problème avec cela, est que ceci suppose la colonne ip_address est le début du sous-réseau 10.0.125.128

Toute aide sera appréciée.

Répondre

3

L'adresse de diffusion est le complément du masque de sous-réseau, OR avec l'adresse IP.

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

(Vous avez à masquer avec "& 0xffffffff" parce que dans MySQL, l'opérateur du complément retourne une valeur binaire 64 bits.)

+0

grande. Merci pour la réponse rapide. – salparadise

Questions connexes