3

UDP マルチキャストを介して「アナウンス」をリッスンするコードがいくつかあります。送信者の IP アドレスを取得できますが、本当に必要なのは送信者の MAC アドレスです (IP アドレスは変更される可能性があり、変更されるため)。

Pythonでこれを行う簡単な方法はありますか?

参照用にコード スニペットが含まれていますが、不要である可能性があります。

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)

# Allow multiple sockets to use the same PORT number
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

# Bind to the port that we know will receive multicast data
sock.bind((self.interface, MCAST_PORT))

# Tell API we are a multicast socket
sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 255)

# Tell API we want to add ourselves to a multicast group
# The address for the multicast group is the third param

status = sock.setsockopt(socket.IPPROTO_IP, 
          socket.IP_ADD_MEMBERSHIP, 
          socket.inet_aton(MCAST_ADDR) + socket.inet_aton(self.interface));

data, addr = sock.recvfrom(1024)

...

4

5 に答える 5

7

通常、MAC アドレスを取得することはできません。LAN 上では ARP を使用して成功するかもしれませんが、インターネット上では不可能です。

受信したパケットに送信者のNATルーターの IP アドレスが含まれている場合を考えてみましょう。パケットは途中で任意の数の中間マシンを通過する可能性があり、それぞれにも MAC アドレスがあります。あなたが求めている種類のルックアップをサポートするのは誰の責任ですか? 途中のすべてのマシンにとって、送信者の MAC アドレスはまったく役に立たないのに、わざわざそのようなルックアップをサポートする必要があるでしょうか?

ところで、多くのネットワーク カードでは、MAC アドレスの変更は些細なことなので、それをある種の一意の ID として使用することは賢明ではありません。

于 2009-11-12T13:53:48.033 に答える
1

MAC アドレスはリンク レベルのアドレスであり、IP のようなネットワーク レベルのアドレスではないため、送信者の MAC アドレスを取得できるかどうかはわかりません。MAC アドレスは、UDP メッセージを含むパケットが送信者から受信者にルーティングされるときに、ネットワーク内の各ホップで変化します。

于 2009-11-12T13:54:18.797 に答える
1

必要なプロトコルはARPです。詳細については、この質問/回答を確認してください

于 2009-11-12T13:52:14.480 に答える