2010-03-02 4 views
3

HI어떻게 UDP 패킷을 캡처하고 파이썬을 사용하여 패킷에서 TTL 값을 찾을 수 있습니까?

멀티 캐스트 그룹에 가입하여 UDP 패킷을 캡처하고 싶습니다. 수신 패킷 후 그 UDP 패킷에서 TTL 값을 확인하고 싶습니다. 어떻게 내가 파이썬을 사용하여 이것을 얻을 수 있습니까? 아래에 설명한 바와 같이

Sammple 번호 : 여기 rec_port 제가 결합하는 데 사용했던 모든 포트; 239.2.2.2

당신은 아마 this 파이썬 래퍼를 사용하려면
#! /usr/bin/env python 
    ......... 
    ............ 
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) 
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
    sock.bind(("", rec_port)) 
    mreq = struct.pack("4sl", socket.inet_aton(rec_hostname), socket.INADDR_ANY) 
    sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) 

    total_length = 0 
    while True: 
      print "Waiting for the packets, if no packets recevied by 10 seconds, than i will exit" 
      sock.settimeout(10) 
      data , address = sock.recvfrom(2048) 
      if len(data) > 1: 
            total_length=total_length + len(data) 
            print "Data is:", data 
            print "Length of data received is:", len(data) 
            print "Packet recevied from :", address[0] 
            print "Total Packet size:", total_length 
      else: 
        break 
    sock.close() 
    print "Total Packet size:", total_length 

답변

2

:; 예를 들어, 예를 들어 9180 rec_hostname 내가 가입 한 멀티 캐스트 그룹입니다. 만족스럽지 않으면 libpcap 자신을 감쌀 수 있습니다.

unwind에 대한 응답으로 : libpcap에서 "promiscious"로 행동 할 필요가 없습니다. 유효한 트래픽을 주입하고 스누핑 할 수 있습니다.

편집 :의 TTL 필드를 분리하는 방법을 알아 내기 위해 pcap에이 자습서를 읽어보십시오.

+0

파이썬 2.3 버전을 사용하고 있습니다.이 버전에서는 pcap 또는 libpcap 모듈/lib를 사용할 수 없습니다. 지원되지 않습니다. 멀티 캐스트 그룹에 바인딩 할 수 있습니다. 하지만 수신 된 패킷에서 TTL 값을 어떻게 읽을 수 있습니까? –

+0

TTL 값은 패킷의 IP 헤더 부분에 있습니다. 일반적으로 사용자 공간 프로그램에서는 사용할 수 없으므로 멀티 캐스트 그룹에 참여하면 도움이되지 않습니다. libpcap 또는 이와 비슷한 것이 필요합니다. pycap 페이지는 그들이 2.3을지지한다고 말하고 있습니까? – Wim

+0

pycap에서 실제로 작동하지 않는 경우, 다른 옵션 (그러나 더 복잡한 옵션)은'os.popen'을 사용하여'tcpdump'를 호출하고 출력을 구문 분석하는 것입니다 ... – Wim

0

댓글에서 멀티 캐스트 그룹에 가입 할 수 있다고 말했습니다.

getsockopt()을 사용할 수 있습니다. 수준 매개 변수에 IPPROTO_IP을 지정하고 옵션에 대해 IP_MULTICAST_TTL을 지정하여 보내는 패킷에 기록되는 TTL 값을 가져올 수 있습니다.

+0

을 참조하십시오. * 들어오는 * 패킷의 TTL을 읽고 싶습니다. – Wim

+0

그래서 내 답장에서 "나가는 패킷"을 지정했습니다. –

+0

예 들어오는 패킷을 원합니다. 멀티 캐스트 그룹에 데이터를 보내는 동안이 비슷한 문제가 생겼습니다. 나는 플리 손 (Plisson)이 묘사 한 방식으로 그것을 해결했다. –

관련 문제