【问题标题】:How can i capture the UDP packet and find the TTL Values from the packet using python如何捕获 UDP 数据包并使用 python 从数据包中找到 TTL 值
【发布时间】:2010-03-02 20:55:03
【问题描述】:

你好

我想通过加入多播组来捕获 UDP 数据包。收到数据包后,我想检查该 UDP 数据包的 TTL 值。如何使用 python 实现这一点?

示例代码如下: 这里 rec_port 是我用来绑定的任何端口;例如:9180 rec_hostname 是我加入的任何多播组;例如:239.2.2.2

 #! /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

【问题讨论】:

    标签: python


    【解决方案1】:

    您可能想使用this python 包装器。如果不满意,您可以自己包装libpcap

    响应 unwind:您不必对 libpcap 采取“任性”行为,您可以注入和窥探有效流量——即,用于您的 NIC。

    编辑:阅读pcap 上的本教程,了解如何隔离 ttl 字段。

    【讨论】:

    • 我使用的是 python 2.3 版本,我想在这个版本中我不能使用 pcap 或 libpcap 模块/lib。这是不支持的。我能够绑定到多播组。但是如何从收到的数据包中读取 TTL 值?
    • TTL 值位于数据包的 IP 标头部分,这通常对用户空间程序不可用,因此加入多播组无济于事——您确实需要 libpcap 或类似的东西。 pycap 页面说他们确实支持 2.3?
    • 如果它真的不能与 pycap 一起工作,另一个(但更混乱)的选择是使用 os.popen 调用 tcpdump 并解析其输出...
    • 我正在尝试使用 python 来自动化我在测试组件时使用的手动验证步骤。如果我想使用 libpcap 或类似的东西,我该如何在我的脚本中实现这些 libpcap?
    • 您需要包装 c 代码并使其可从 python 调用。见docs.python.org/extending/extending.html
    【解决方案2】:

    在评论中,您告诉我们您可以加入多播组。

    现在您可以使用getsockopt(),将IPPROTO_IP 指定为level 参数,将IP_MULTICAST_TTL 指定为选项,以获取写入传出数据包的TTL 值。

    【讨论】:

    • 这就是我在回复中指定“传出数据包”的原因。
    • 是的,我想要传入的数据包。我在将数据发送到多播组时遇到了类似的问题。我已经按照 Plisson 详细介绍的方式解决了。
    猜你喜欢
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 2012-09-30
    相关资源
    最近更新 更多