Kam*_*mal 1 python sockets udp ipv6
我正在尝试从我的虚拟机将python中的套接字绑定到其他虚拟机的地址,以便可以嗅探两者交换的帧。所以这是我的代码
import socket
UDP_IP = "fe80:849b:21f4:624c:d70b"
UDP_PORT = 61627
sock = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1)
sock.bind((UDP_IP, UDP_PORT))
while True:
data, addr = sock.recvfrom(1024)
print(data)
Run Code Online (Sandbox Code Playgroud)
当我尝试执行python时,出现错误消息:
sock.bind((UDP_IP, UDP_PORT))
socket.error: [Error 22] Invalid argument
Run Code Online (Sandbox Code Playgroud)
我做错了,在此先感谢!
我敢打赌,您已经找到了答案,但是乍一看,我发现代码存在两个问题:
因此,对于我的MacOS笔记本电脑,UDP_IP地址可能类似于:
UDP_IP = "fe80:849b:21f4:624c:d70b%en0"
Run Code Online (Sandbox Code Playgroud)
因此,可以通过socket.getaddrinfo(IP,PORT)来获取这些字段,该套接字返回每个地址族和socket_kind的元组列表。用类似的东西过滤它们:
for ainfo in socket.getaddrinfo(UDP_IP, UDP_PORT):
if ainfo[0].name == 'AF_INET6' and ainfo[1].name == 'SOCK_DGRAM':
target_address = ainfo[4]
break
sock.bind(target_address)
Run Code Online (Sandbox Code Playgroud)
我不确定,如果我编写的示例代码正确,因为我没有对其进行测试,请在使用前进行检查。