ipv 6 socket pythonネットワークプログラミング
ipv6 socket 常用方法 アドレスによるソケット作成: ttl/hop設定: アドレス多重化: バインド: マルチキャストグループへの加入(オペレーティングシステムへのマルチキャストメッセージの購読) マルチキャスト送信を指定するインタフェース:
参考例 ipv 6マルチキャスト傍受
一般的な方法
アドレスによるsocketの作成:
INETまたはINET 6を事前に指定する必要はありません.
最初のパラメータを返すのはsocket.AF_INET 6は最初のパラメータを取得してipv 4/ipv 6を知ることができます
ttl/hopの設定:
アドレスの多重化:
バインド:
全マルチキャスト受信:
ipv4:
ipv 6:インタフェースインデックスが追加され、0はデフォルトのネットワークインタフェースを表します.
マルチキャスト送信のインタフェースを指定します.
参考例
ipv 6マルチキャスト傍受 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
一般的な方法
アドレスによる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))
iface
NICオブジェクト、例えば
NICインデックスを取得する2つの方法:int(netifaces.ifaddresses(iface.guid)[socket.AF_INET6][-1]["broadcast"].split("%")[-1])
iface.win_index
targer_ip
傍受網セグメント上の任意のアドレスですsystem()
はいfrom platfrom import system
https://stackoverflow.com/questions/47280816/windows-doesnt-receive-multicast-ipv6-packets-from-all-interfaces
https://docs.python.org/3/library/socket.html