用python来调试网络程序

需要联调的程序,沟通联调起来总是各种麻烦,如果自己能写个简单一点的“测试机”,事情就很easy了;或者有时候想做“中间人”,看看网路上到底传些什么。前面写了串口的测试机,今天尝试了一下UDP的。

import socket
from struct import *

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_UDP)

while True:
    packet = s.recvfrom(65565)
    packet = packet[0]

    ip_header = packet[0:20]
    iph = unpack(‘!BBHHHBBH4s4s‘, ip_header)

    version_ihl = iph[0]
    version = version_ihl >> 4
    ihl = version_ihl & 0xf

    ttl = iph[5]
    protocol = iph[6]
    s_addr = socket.inet_ntoa(iph[8])
    d_addr = socket.inet_ntoa(iph[9])

    print ‘---> src_addr:‘+s_addr+‘,dst_addr:‘+d_addr

    udp_header = packet[20:28]
    udph = unpack(‘!HHHH‘, udp_header)

    s_port = udph[0]
    d_port = udph[1]
    data_length = udph[3]

    print ‘    src_port:‘+str(s_port)+‘,dst_port:‘+str(d_port)

简单做一下注释:

1. raw_socket,字面理解是“裸”套接字,这个“裸”对应用编程人员来说就是,未经过解析的。

2. recvfrom(length),注意,这里的参数是缓存区的大小,并不是port。因为我们在这里recvfrom()到的,是本机所有的UDP datagram(tcp使用IPPROTO_TCP,ICMP使用IPPROTO_ICMP)。

3. recvfrom的返回是一个tuple,类似下面:

("E \x00x\xcc\xfc\x00\x000\x06j%J}G\x13\xc0\xa8\x01\x06\x01\xbb\xa3\xdc\x0b\xbeI\xbf\x1aF[\x83P\x18\xff\xff\x88\xf6\x00\x00\x17\x03\x01\x00\x1c\xbbT\xb3\x07}\xb0\xedqE\x1e\xe7;-\x03\x9bU\xb7\xb1r\xd2\x9e]\xa1\xb8\xac\xa4V\x9a\x17\x03\x01\x00*\xed\x1f\xda\xa4##Qe\x9a\xe9\xd6\xadN\xf4\x9b\xc4\xf0C‘\x01\xc4\x82\xdb\xb2\x8d(\xa5\xd0\x06\x95\x13WO\x0f\x8e\x1c\xa6f\x1d\xdf\xe1x", (‘74.125.71.19‘, 0))

4. unpack是struct包中的函数,format字符串的含义在pydoc struct中有解释。如:‘!’表示big-endian,也可以使用‘>’代替;‘H’表示unsigned short。

另一个,截取TCP包的代码,IP头部分与上面udp解析一样:

    tcp_header = packet[20:40]

    #now unpack them :)
    tcph = unpack(‘!HHLLBBHHH‘ , tcp_header)

    source_port = tcph[0]
    dest_port = tcph[1]
    sequence = tcph[2]
    acknowledgement = tcph[3]
    doff_reserved = tcph[4]
    tcph_length = doff_reserved >> 4

    print ‘Source Port : ‘ + str(source_port) + ‘ Dest Port : ‘ + str(dest_port) + ‘ Sequence Number : ‘ + str(sequence) + ‘ Acknowledgement : ‘ + str(acknowledgement) + ‘ TCP header length : ‘ + str(tcph_length)

    h_size = ihl * 4 + tcph_length * 4
    data_size = len(packet) - h_size

    #get data from the packet
    data = packet[data_size:]

    print ‘Data : ‘ + data

另外,此方法还支持PF_PACKET,所以可以直接用来抓取以太网数据(只有x-nix系统支持PF_PACKET,所以,windows系统还得使用wpcap)。

想要抓取经过自己网卡的所有数据包,需要网卡进入“promiscuous mode”。有两种方法:手动“ifconfig eth0 promisc”打开;使用ioctl,修改socket的配置"ifr.ifr_flags |= IFF_PROMISC"。

时间: 2024-10-05 05:50:25

用python来调试网络程序的相关文章

Erlang Shell调试网络程序真方便

Erlang的shell功能强大,这里我将它当成我的客户端.可以动态的输入你需要发送的内容,也可以动态的接收内容,就像调试器一样,在开发过程中起到很重要的作用.具体使用方式如下: C:\Documents and Settings\Administrator>erl Eshell V5.10.4 (abort with ^G) 1> {ok, Socket} = gen_tcp:connect("localhost", 2000, [binary, {packet, 2}]

Python写的网络爬虫程序(很简单)

Python写的网络爬虫程序(很简单) 这是我的一位同学传给我的一个小的网页爬虫程序,觉得挺有意思的,和大家分享一下.不过有一点需要注意,要用python2.3,如果用python3.4会有些问题出现. python程序如下: import re,urllib strTxt="" x=1 ff=open("wangzhi.txt","r") for line in ff.readlines(): f=open(str(x)+".txt&

python:UDP网络程序与总结

UDP网络程序 一.创建一个udp客户端程序 流程简单,具体步骤如下: 创建客户端套接字 发送/接收数据 关闭套接字 二.发送数据 from socket import * #1. 创建套接字 udpSocket = socket(AF_INET, SOCK_DGRAM) #2. 准备接收方的地址 sendAddr = ('192.168.1.103', 8080) #3. 从键盘获取数据 sendData = input("请输入要发送的数据:") #4. 发送数据到指定的电脑上 u

【转】Python 代码调试技巧

转载自:http://www.ibm.com/developerworks/cn/linux/l-cn-pythondebugger/ Debug 对于任何开发人员都是一项非常重要的技能,它能够帮助我们准确的定位错误,发现程序中的 bug.python 提供了一系列 debug 的工具和包,可供我们选择.本文将主要阐述如何利用 python debug 相关工具进行 debug. 使用 pdb 进行调试 pdb 是 python 自带的一个包,为 python 程序提供了一种交互的源代码调试功能

关于Python代码调试的问题

关于Python代码调试的问题使用 pdb 进行调试pdb 是 python 自带的一个包,为 python 程序提供了一种交互的源代码调试功能,主要特性包括设置断点.单步调试.进入函数调试.查看当前代码.查看栈片段.动态改变变量的值等.pdb 提供了一些常用的调试命令,下面结合具体的实例讲述如何使用 pdb 进行调试.import pdb   a = "aaa" pdb.set_trace()   b = "bbb" c = "ccc" fin

python代码调试

http://blog.csdn.net/pipisorry/article/details/45190851 trace模块可以监控Python执行程序的方式,同时生成一个报表来显示程序的每一行执行的次数.这些信息可以用来发现未被自动化测试集所覆盖的程序执行路径,也可以用来研究程序调用图,进而发现模块之间的依赖关系.编写并执行测试可以发现绝大多数程序中的问题,Python使得debug工作变得更加简单,这是因为在大部分情况下,Python都能够将未被处理的错误打印到控制台中,我们称这些错误信息

Python四大主流网络编程框架

目前Python的网络编程框架已经多达几十个,逐个学习它们显然不现实.但这些框架在系统架构和运行环境中有很多共通之处,本文带领读者学习基于Python网络框架开发的常用知识,及目前的4种主流Python网络框架:Django.Tornado.Flask.Twisted. 网络框架及MVC架构 所谓网络框架是指这样的一组Python包,它能够使开发者专注于网站应用业务逻辑的开发,而无须处理网络应用底层的协议.线程.进程等方面.这样能大大提高开发者的工作效率,同时提高网络应用程序的质量. 在目前Py

udp网络程序-发送、接收数据

1. udp网络程序-发送数据 创建一个基于udp的网络程序流程很简单,具体步骤如下: 创建客户端套接字 发送/接收数据 关闭套接字 代码如下: #coding=utf-8 from socket import * # 1. 创建udp套接字 udp_socket = socket(AF_INET, SOCK_DGRAM) # 2. 准备接收方的地址 # '192.168.1.103'表示目的ip地址 # 8080表示目的端口 dest_addr = ('192.168.1.103', 8080

下载大数据实战课程第一季Python基础和网络爬虫数据分析

python语言近年来越来越被程序相关人员喜欢和使用,因为其不仅简单容易学习和掌握,而且还有丰富的第三方程序库和相应完善的管理工具:从命令行脚本程序到gui程序,从B/S到C/S,从图形技术到科学计算,软件开发到自动化测试,从云计算到虚拟化,所有这些领域都有python的身影:python已经深入到程序开发的各个领域,并且会越来越多的人学习和使用. 大数据实战课程第一季Python基础和网络爬虫数据分析,刚刚入手,转一注册文件,视频的确不错,可以先下载看看:链接:http://pan.baidu