2 回答
TA贡献2051条经验 获得超10个赞
要“说服”网络堆栈使用以太网(或 WiFi)卡而不是环回来物理传输帧,请使用广播地址。
我已经在我的 Linux 系统上以这种方式成功发送和接收了一个 UDP 数据包。我用tcpdump. 它在以太网接口上显示一个数据包,并且在环回上没有活动。
我使用了文字广播地址。套接字模块文档还提到了字符串作为'<broadcast>'特例地址。我没有试过。
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sock:
sock.setblocking(False)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
sock.connect(('192.168.0.255', 4567))
await loop.sock_sendall(sock, b'somedata')
await asyncio.sleep(1)
笔记:
同一网络上的其他主机也会收到 UDP 数据包。
确保防火墙/数据包过滤器(例如 Linux iptables/nftables)不会阻止数据包。
关于
setsockopt
:Python socket.error: [Errno 13] Permission denied
TA贡献1816条经验 获得超6个赞
这可能是因为您的主机名指向环回地址,因此socket.gethostbyname(socket.gethostname())
会产生127.0.0.1
您需要做的是取消从主机名指向环回地址的操作:
在 Linux 中编辑
/etc/hosts
并注释掉该行127.0.0.1 YOUR_HOSTNAME
在 Windows 中,您应该拥有
c:\windows\system32\drivers\etc\hosts
类似于 Linux 的
在此之后,如果您调用socket.gethostbyname(socket.gethostname())
它,它将产生您的 DHCP 分配的 IP。
即使在这种情况下,调用 from yourip
toyourip
也可能导致网络驱动程序通过环回接口路由包。另一种方法是在网络路由器之外使用公共 IP。您可以使用此答案中描述的外部服务
添加回答
举报