我最终试图测试一个 UDP 客户端,并希望确保它在不通过环回接口发送数据时工作,以避免由此引入的任何细微问题,例如校验和验证的差异(Bad UDP checksum 无效:为什么?)。
但是,即使将数据发送到不是 的结果socket.gethostbyname(socket.gethostname()),127.0.0.1根据 Wireshark 的说法,数据似乎也是通过环回接口进行的。
以下程序b'somedata'成功发送和接收,并从 Wireshark 捕获以下内容。
import asyncio
import socket
async def server():
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sock:
sock.setblocking(False)
sock.bind(('', 4567))
data = await loop.sock_recv(sock, 512)
print('Received', data)
async def main():
local_ip = socket.gethostbyname(socket.gethostname())
print('Local IP', local_ip) # Outputs 192.168.0.34
asyncio.ensure_future(server())
await asyncio.sleep(0)
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sock:
sock.setblocking(False)
sock.connect((local_ip, 4567))
await loop.sock_sendall(sock, b'somedata')
await asyncio.sleep(1)
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()
如何将数据从本地运行的客户端发送到本地运行的服务器,但避免环回接口并实际将数据发送到网络?
理想情况下,答案将适用于 Linux 和 macOS。
侃侃无极
潇湘沐
相关分类