如何使用python捕获UDP数据包并从数据包中查找TTL值

如何使用python捕获UDP数据包并从数据包中查找TTL值,python,Python,嗨 我想通过加入多播组来捕获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_DG

我想通过加入多播组来捕获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包装器。如果不满意,你可以自己包装

作为对“放松”的响应:您不必对libpcap采取“滥交”的行为,您可以注入和窥探有效的流量——即用于您的NIC的流量


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

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


现在您可以使用
getsockopt()
,为level参数指定
IPPROTO\u IP
,为选项指定
IP\u MULTICAST\u TTL
,以获取写入传出数据包的TTL值。

我使用的是python 2.3版本,我想在这个版本中我不能使用pcap或libpcap模块/lib。这是不受支持的。我可以绑定到多播组。但是如何从接收到的数据包中读取TTL值呢?TTL值位于数据包的IP报头部分,这通常对用户空间程序不可用,因此加入多播组没有帮助--您确实需要libpcap或类似的东西。pycap页面说他们确实支持2.3版本?如果pycap真的不支持,另一个选项(但messier)是使用
os.popen
调用
tcpdump
,并解析其输出……我正试图使用python来自动执行用于测试组件的手动验证步骤。如果我真的想使用libpcap或类似的东西,那么如何在脚本中实现这些libpcap呢?您需要包装c代码并使其可以从python调用。这就是我在回复中指定“传出数据包”的原因。是的,我想要传入数据包。我在将数据发送到多播组时遇到了类似的问题。我已经按照普利松详述的方式解决了这个问题。