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

我需要对套接字配置进行哪些更改,以便以隔离网络接口的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)

数据包按预期传输,但源地址除外.有什么 idea 吗?我使用的是Python3.6.我知道它很旧,但这就是他们在这里用的.

推荐答案

如果不将套接字绑定到特定地址,网络堆栈将任意 Select 源地址,并且不必与其发送的接口的地址相同.如果您想要特定的源地址,请拨打sock.bind().

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.bind((src_ip, 0))
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)

bind()中的端口0允许操作系统 Select 未使用的源端口.

Python相关问答推荐

使用pandas MultiIndex进行不连续 Select

Pandas数据帧处理Pandas表中Json内的嵌套列表以获取后续Numpy数组

取相框中一列的第二位数字

PyTorch卷积自动编码器,输出维度与输入不同

如何使用关键参数按列对Pandas rame进行排序

按 struct 值对Polars列表[struct[]]排序

Matplotlib轮廓线值似乎不对劲

如何销毁框架并使其在tkinter中看起来像以前的样子?

Python中的嵌套Ruby哈希

Pandas 都是(),但有一个门槛

从numpy数组和参数创建收件箱

如何制作10,000年及以后的日期时间对象?

PMMLPipeline._ fit()需要2到3个位置参数,但给出了4个位置参数

如何在Django基于类的视图中有效地使用UTE和RST HTIP方法?

OR—Tools CP SAT条件约束

在vscode上使用Python虚拟环境时((env))

将输入聚合到统一词典中

Odoo 16使用NTFS使字段只读

isinstance()在使用dill.dump和dill.load后,对列表中包含的对象失败

如何防止Pandas将索引标为周期?