Skip to content

Instantly share code, notes, and snippets.

@nnemkin
Last active January 14, 2024 06:12

Revisions

  1. nnemkin revised this gist May 10, 2015. 1 changed file with 4 additions and 4 deletions.
    8 changes: 4 additions & 4 deletions win_inet_pton.py
    Original file line number Diff line number Diff line change
    @@ -25,9 +25,9 @@ def inet_pton(address_family, ip_string):
    raise socket.error(ctypes.FormatError())

    if address_family == socket.AF_INET:
    return string_at(addr.ipv4_addr, 4)
    return ctypes.string_at(addr.ipv4_addr, 4)
    if address_family == socket.AF_INET6:
    return string_at(addr.ipv6_addr, 16)
    return ctypes.string_at(addr.ipv6_addr, 16)

    raise socket.error('unknown address family')

    @@ -36,7 +36,7 @@ def inet_ntop(address_family, packed_ip):
    addr.sa_family = address_family
    addr_size = ctypes.c_int(ctypes.sizeof(addr))
    ip_string = ctypes.create_string_buffer(128)
    ip_string_size = ctypes.c_int(ctypes.sizeof(addr))
    ip_string_size = ctypes.c_int(ctypes.sizeof(ip_string))

    if address_family == socket.AF_INET:
    if len(packed_ip) != ctypes.sizeof(addr.ipv4_addr):
    @@ -52,4 +52,4 @@ def inet_ntop(address_family, packed_ip):
    if WSAAddressToStringA(ctypes.byref(addr), addr_size, None, ip_string, ctypes.byref(ip_string_size)) != 0:
    raise socket.error(ctypes.FormatError())

    return ip_string[:ip_string_size.value]
    return ip_string[:ip_string_size.value - 1]
  2. nnemkin revised this gist Sep 21, 2013. 1 changed file with 5 additions and 0 deletions.
    5 changes: 5 additions & 0 deletions win_inet_pton.py
    Original file line number Diff line number Diff line change
    @@ -1,3 +1,8 @@
    # This software released into the public domain. Anyone is free to copy,
    # modify, publish, use, compile, sell, or distribute this software,
    # either in source code form or as a compiled binary, for any purpose,
    # commercial or non-commercial, and by any means.

    import socket
    import ctypes

  3. nnemkin created this gist Feb 16, 2013.
    50 changes: 50 additions & 0 deletions win_inet_pton.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,50 @@
    import socket
    import ctypes

    class sockaddr(ctypes.Structure):
    _fields_ = [("sa_family", ctypes.c_short),
    ("__pad1", ctypes.c_ushort),
    ("ipv4_addr", ctypes.c_byte * 4),
    ("ipv6_addr", ctypes.c_byte * 16),
    ("__pad2", ctypes.c_ulong)]

    WSAStringToAddressA = ctypes.windll.ws2_32.WSAStringToAddressA
    WSAAddressToStringA = ctypes.windll.ws2_32.WSAAddressToStringA

    def inet_pton(address_family, ip_string):
    addr = sockaddr()
    addr.sa_family = address_family
    addr_size = ctypes.c_int(ctypes.sizeof(addr))

    if WSAStringToAddressA(ip_string, address_family, None, ctypes.byref(addr), ctypes.byref(addr_size)) != 0:
    raise socket.error(ctypes.FormatError())

    if address_family == socket.AF_INET:
    return string_at(addr.ipv4_addr, 4)
    if address_family == socket.AF_INET6:
    return string_at(addr.ipv6_addr, 16)

    raise socket.error('unknown address family')

    def inet_ntop(address_family, packed_ip):
    addr = sockaddr()
    addr.sa_family = address_family
    addr_size = ctypes.c_int(ctypes.sizeof(addr))
    ip_string = ctypes.create_string_buffer(128)
    ip_string_size = ctypes.c_int(ctypes.sizeof(addr))

    if address_family == socket.AF_INET:
    if len(packed_ip) != ctypes.sizeof(addr.ipv4_addr):
    raise socket.error('packed IP wrong length for inet_ntoa')
    ctypes.memmove(addr.ipv4_addr, packed_ip, 4)
    elif address_family == socket.AF_INET6:
    if len(packed_ip) != ctypes.sizeof(addr.ipv6_addr):
    raise socket.error('packed IP wrong length for inet_ntoa')
    ctypes.memmove(addr.ipv6_addr, packed_ip, 16)
    else:
    raise socket.error('unknown address family')

    if WSAAddressToStringA(ctypes.byref(addr), addr_size, None, ip_string, ctypes.byref(ip_string_size)) != 0:
    raise socket.error(ctypes.FormatError())

    return ip_string[:ip_string_size.value]