Python 套接字在正确的接口上传输,但源地址错误

问题描述 投票:0回答:1

我有一个具有多个网络接口的多播系统。使用我创建的套接字传输的数据包正在从正确的接口发出,但数据包的源地址不正确。源地址应与用于通过隔离网络传输数据包的接口匹配,但它使用来自专用网络(最终连接到互联网)上的接口的源地址。

我需要对套接字配置进行哪些更改,以便使用隔离网络接口的 IP 地址作为源地址发送传输的数据包?

import socket

src_ip = '172.17.0.1'   # isolated network interface IP address which should be source address but isn't
dst_ip = '225.17.0.18'  # destination IP address
port = 30000
msg = bytes([0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x88, 0xAA, 0xBB, 0xCC, 0xDD ])

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.connect((dst_ip, port))
sock.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_IF, socket.inet_aton(src_ip))
sock.setsockopt(socket.SOL_IP, socket.IP_ADD_MEMBERSHIP, socket.inet_aton(dst_ip) + socket.inet_aton(src_ip))
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

sock.sendall(msg)

数据包按预期传输,但源地址除外。有什么想法吗?我正在使用Python 3.6。我知道它很旧,但这就是他们在这里使用的。

python sockets ip-address multicast transmission
1个回答
0
投票

如果不将套接字绑定到特定地址,则网络堆栈会任意选择源地址,并且不必与其发送的接口地址相同。如果您想要具体的源地址,请致电

sock.bind()

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.connect((dst_ip, port))
sock.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_IF, socket.inet_aton(src_ip))
sock.bind((src_ip, 0))
sock.setsockopt(socket.SOL_IP, socket.IP_ADD_MEMBERSHIP, socket.inet_aton(dst_ip) + socket.inet_aton(src_ip))
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

bind()
中指定端口 0 允许操作系统选择未使用的源端口。

© www.soinside.com 2019 - 2024. All rights reserved.