2010-11-23 5 views
3

Le livre de chameau suggère que les chaînes de V peuvent être utilisés pour représenter les adresses IPv4:Puis-je utiliser des chaînes v pour les adresses IPv4?

$ipaddr = 204.148.40.9; # the IPv4 address of oreilly.com 

Mais perldata sur le sujet de la version Strings stipule:

Notez que l'utilisation des v-chaînes pour IPv4 adresses n'est pas portable sauf si vous utilisez également les routines inet_aton()/inet_ntoa() du package Socket.

J'ai deux questions:

1) Pourquoi l'aide des v-chaînes non portable?
2) Quelle est la méthode "standard" pour convertir une adresse IP d'une notation pointée en entier? Il semble que unpack "N", <v-string> peut parfois causer des problèmes.

Répondre

5

La méthode "standard" pour obtenir le formulaire codé est inet_aton, qui gère les adresses IP pointées ainsi que les noms d'hôtes - mais qu'est-ce que vous en avez besoin? Le plus souvent, la meilleure idée consiste simplement à ignorer toutes les interfaces de bas niveau qui traitent de telles choses et utilisent, par exemple, IO :: Socket. Si vous cherchez à convertir nombre entier, comme vous le dites, et non à la forme que les fonctions de socket attendent (ce sont des concepts similaires en C, mais moins en Perl), alors vous pouvez aller de l'avant et utilisez pack juste très bien tant que vous êtes cohérent - la partie qui est unportable est le format que les fonctions de socket acceptent. Par exemple, unpack "N", pack "C4", split /\./, "1.2.3.4" vous obtiendra une belle représentation big-endian non signée de cette adresse (sous la forme du nombre 16909060 == 0x01020304).

Questions connexes