ipv 6 socket pythonネットワークプログラミング


ipv6 socket
  • 常用方法
  • アドレスによるソケット作成:
  • ttl/hop設定:
  • アドレス多重化:
  • バインド:
  • マルチキャストグループへの加入(オペレーティングシステムへのマルチキャストメッセージの購読)
  • マルチキャスト送信を指定するインタフェース:

  • 参考例
  • ipv 6マルチキャスト傍受

  • 一般的な方法
    アドレスによるsocketの作成:
    INETまたはINET 6を事前に指定する必要はありません.
    MYGROUP_4 = '225.0.0.250'
    MYGROUP_6 = 'ff15:7079:7468:6f6e:6465:6d6f:6d63:6173'
    addrinfo = socket.getaddrinfo(MYGROUP_6, None)[0]
    (10, 1, 6, '', ('ff02::1:3', 0, 0, 0))
    

    最初のパラメータを返すのはsocket.AF_INET 6は最初のパラメータを取得してipv 4/ipv 6を知ることができます
    ttl/hopの設定:
    ttl_bin = struct.pack('@i', MYTTL: int)
    s.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, ttl_bin)
    s.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, ttl_bin)
    

    アドレスの多重化:
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    

    バインド:
    全マルチキャスト受信:s.bind(('', MYPORT))指定マルチキャスト受信:s.bind(('224.0.0.252', MYPORT))マルチキャストグループに参加する(オペレーティングシステムにマルチキャストメッセージを購読する)
    group_bin = socket.inet_pton(addrinfo[0], addrinfo[4][0])
    

    ipv4:
    mreq = group_bin + struct.pack('=I', socket.INADDR_ANY)
    s.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
    

    ipv 6:インタフェースインデックスが追加され、0はデフォルトのネットワークインタフェースを表します.
    mreq = group_bin + struct.pack('@I', 0)
    s.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq)
    

    マルチキャスト送信のインタフェースを指定します.
    sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, socket.inet_aton(addr))
    host = socket.gethostbyname(socket.gethostname())
    sock.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_IF, socket.inet_aton(host))
    

    参考例
    ipv 6マルチキャスト傍受
    group_ipv6 = "FF02::1:3"
    llmnr_port = 5355
    s_ipv6 = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
    s_ipv6.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    s_ipv6.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, struct.pack('@i', 255))
    group = socket.inet_pton(socket.AF_INET6, group_ipv6)
    if system() == "Windows":
    	mreq = group + struct.pack('@I', get_ipv6_ifindex(get_iface_by_ip(targer_ip)))
    else:
    	mreq = group + struct.pack('@I', socket.if_nametoindex(get_iface_by_ip(targer_ip)))
    s_ipv6.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq)
    s_ipv6.bind((group_ipv6, llmnr_port))
    
    ifaceNICオブジェクト、例えばNICインデックスを取得する2つの方法:
  • int(netifaces.ifaddresses(iface.guid)[socket.AF_INET6][-1]["broadcast"].split("%")[-1])
  • iface.win_indextarger_ip傍受網セグメント上の任意のアドレスですsystem()はいfrom platfrom import system
  • Windows ipv 6バインドインタフェースリファレンスリンク:
    https://stackoverflow.com/questions/47280816/windows-doesnt-receive-multicast-ipv6-packets-from-all-interfaces
    https://docs.python.org/3/library/socket.html