문제

UDP 멀티 캐스트를 통해 "공지 사항"을 듣는 코드가 있습니다. 발신자의 IP 주소를 얻을 수 있지만 실제로 필요한 것은 발신자의 MAC 주소입니다 (IP 주소가 변경 될 수 있고 변경되므로).

파이썬 에서이 작업을 수행하는 쉬운 방법이 있습니까?

코드 스 니펫은 참조를 위해 포함되어 있지만 불필요 할 것입니다.

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)

...

도움이 되었습니까?

해결책

일반적으로 Mac 주소를 얻을 수 없습니다. LAN에서 ARP를 사용하여 성공할 수 있지만 인터넷을 통해 불가능합니다.

받는 패킷에 발신자의 IP 주소가있는 경우를 고려하십시오. 네이트 팅 라우터. 패킷은 그 과정에서 여러 가지 중간 기계를 가로 질러 MAC 주소를 가질 수 있습니다. 당신이 후에 조회를 지원하는 것은 누구의 책임이어야합니까? 길을 따라 모든 기계의 경우 발신자의 MAC 주소는 완전히 쓸모가 없으므로 왜 그런 종류의 조회를 지원 하는가?

그리고 btw, MAC 주소 변경 많은 네트워크 카드에서 사소한 것이므로, 어떤 종류의 고유 한 ID로 사용하는 것은 현명한 아이디어가 아닙니다.

다른 팁

필요한 프로토콜은입니다 아프. 이것을 확인하십시오 질문 답변 자세한 내용은

Mac 주소가 IP와 같은 네트워크 레벨 주소가 아닌 링크 레벨 주소이기 때문에 발신자의 MAC 주소를 얻을 수 있는지 확실하지 않습니다. UDP 메시지가 포함 된 패킷이 발신자에서 수신기로 라우팅되므로 Mac 주소는 네트워크의 각 홉에서 변경됩니다.

파이썬에서 어떻게하는지 모르겠지만 Mac 주소를 얻을 수 있습니다. 예를 들어 tcpdump를 사용하면 모든 패킷을 파일에 넣습니다.

sudo tcpdump -i enp0s31f6 -w file_name port 6665

그런 다음 파이썬에서 다음과 같이 읽습니다.

       packetlist = rdpcap("./file_name")
       for pkt in packetlist:  
       print pkt.src, pkt.load

Mac 주소를 볼 수 있습니다

편집 :이 작업을 수행하는 한 가지 방법을 찾았습니다. 기능 스니핑의 도움으로 SCAPY로 모든 패키지를 스니핑 한 다음 패키지를 필터링하여 필요한 것만 얻습니다. 예를 들어 내 프로젝트에서 Mac 주소를 사용할 수 있습니다.

sniff(prn=self._pkt_callback, store=0)

def _pkt_callback(self, pkt):
    if not self.sniffer_on:
         return
    if Ether not in pkt or pkt[Ether].type != 0x800:
        return
    if pkt[IP].proto != 17: # 17 means UDP package
        return
    if pkt[UDP].dport != 6665:
        return

    print pkt.src, pkt.load    #src is mac address
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top