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。您可以使用此答案中描述的外部服務
添加回答
舉報