如何在有两个以太网卡的情况下发送UDP广播?
我有两张网卡,我想在本地网络(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。