如何在有两个以太网卡的情况下发送UDP广播?

4 投票
2 回答
3944 浏览
提问于 2025-04-17 19:09

我有两张网卡,我想在本地网络(192.168.0.255)上发送UDP广播消息,但似乎消息只通过第一张网卡发送出去。

ip ="255.255.255.255"
UDPSocket = socket.socket( socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP )
UDPSocket.setsockopt( socket.SOL_SOCKET, socket.SO_BROADCAST, True )
UDPSocket.settimeout( timeout )
UDPSocket.sendto( msg.xmlmsg, ( ip, UDPport ) )

UDPSocket.close()

我该怎么指定我想通过哪个子网发送消息呢?

2 个回答

3

这个被接受的答案对我来说不管用,我在尝试通过一个原始套接字发送ICMP ECHO请求。于是我不得不这样做:

target = '8.8.8.8'
packet = bytearray(...)
sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)
sock.setsockopt(socket.SOL_SOCKET, 25, 'eth0') # or whatever the name of the interface is
                                               # 25 = SO_BINDTODEVICE
                                               # Some Python installations will have the constant IN.SO_BINDTODEVICE which you can use here, YMMV
sock.sendto(packet, (target, 1))
4

你需要把这个套接字绑定到一个本地地址上。

对于非广播的UDP套接字,通常会绑定到一个叫做任意地址(0.0.0.0)。你也可以选择一个特定的端口,或者让系统为你选择一个(端口0)。如果你没有明确绑定这个套接字,它会在第一次send时自动绑定到0.0.0.0:0。

如果你想进行广播,建议你明确绑定,并指定你选择的接口的本地地址。如果你不需要特定的端口,可以使用端口0。

撰写回答