В конечном итоге я пытаюсь протестировать UDP-клиент и хочу убедиться, что он работает при отправке данных , а не через интерфейс обратной связи, чтобы избежать каких-либо тонких проблем, таких как различия в контрольной сумме.проверка ( Плохая контрольная сумма UDP не имеет никакого значения: почему? ).
Однако даже при отправке данных результат 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.