ipv6 validation
Roy Smith
roy at panix.com
Sat Mar 18 14:43:02 EST 2006
In article <1142705173.912345.301840 at g10g2000cwb.googlegroups.com>,
jiri.juranek at kctdata.cz wrote:
> Hello,
> is there any common function for validation if string contains valid ip
> address(both ipv4 and ipv6)? Or does sb wrote some regular expression
> for this?
> thanks
> J
Look at socket.inet_pton(). First check to make sure ipv6 is supported on
your platform, then pass your string to inet_pton() inside of a try block
to catch socket.error. It would have been nicer is a more specific
exception was thrown, but this seems to work. For example:
>>> socket.has_ipv6
True
>>> socket.inet_pton(socket.AF_INET6, "8001::1244")
'\x80\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12D'
>>> socket.inet_pton(socket.AF_INET6, "8001:xyz:1244")
Traceback (most recent call last):
File "<stdin>", line 1, in ?
socket.error: illegal IP address string passed to inet_pton
>>>
Be aware that IPv6 support is messy on Windows. For example, if you're
running Win 2003 (or XP, I would guess), the OS does support IPv6 (and thus
socket.has_ipv6 will probably bet set to True) but the IPv6 libraries don't
actually get loaded until you configure an IPv6 address on some interface.
This means things like inet_pton() will fail, which is truly bletcherous
and evil.
Writing a regex to recognize valid IPv6 presentation strings is not
trivial. Keep in mind that you're allowed exactly 0 or 1 "::" occurrances,
and things like "ffff::192.168.11.1" are legal (I don't remember if I got
the semantics right there, but the syntax is legal).
More information about the Python-list
mailing list