3

2枚のイーサネットカードがあり、ローカルネットワーク(192.168.0.255)でUDPブロードキャストメッセージを送信したいのですが、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()

魔女のサブネットがメッセージを送信することをどのように指定できますか?

4

2 に答える 2

3

bindローカルアドレスにソケットする必要があります。

非ブロードキャストUDPソケットの場合、通常は任意のアドレス(0.0.0.0)にバインドします。特定のポートを選択することも、システムにポートを選択させることもできます(ポート0)。ソケットを明示的にバインドしない場合、最初のソケットは自動的に0.0.0.0:0にバインドされますsend

ブロードキャストを行うには、バインドを明示的に行い、選択したインターフェイスの独自のローカルアドレスを指定することを常にお勧めします。特定のポートが必要ない場合は、ポート0を使用できます。

于 2013-03-14T23:37:15.293 に答える
0

受け入れられた答えは、rawソケットで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))
于 2018-11-12T12:02:25.337 に答える