python构造icmp echo请求和实现网络探测器功能代码分享


Posted in Python onJanuary 10, 2014

python发送icmp echo requesy请求

import socket
import struct
def checksum(source_string):
    sum = 0
    countTo = (len(source_string)/2)*2
    count = 0
    while count<countTo:
        thisVal = ord(source_string[count + 1])*256 + ord(source_string[count])
        sum = sum + thisVal
        sum = sum & 0xffffffff 
        count = count + 2
    if countTo<len(source_string):
        sum = sum + ord(source_string[len(source_string) - 1])
        sum = sum & 0xffffffff 
    sum = (sum >> 16)  +  (sum & 0xffff)
    sum = sum + (sum >> 16)
    answer = ~sum
    answer = answer & 0xffff
    answer = answer >> 8 | (answer << 8 & 0xff00)
    return answer
def ping(ip):
    s = socket.socket(socket.AF_INET, socket.SOCK_RAW, 1)
    packet = struct.pack(
            "!BBHHH", 8, 0, 0, 0, 0
    )
    chksum=checksum(packet)
    packet = struct.pack(
            "!BBHHH", 8, 0, chksum, 0, 0
    )
    s.sendto(packet, (ip, 1))
if __name__=='__main__':
    ping('192.168.41.56')

扫描探测网络功能(网络探测器)

#!/usr/bin/env python3
# -*- coding: utf-8 -*-'''
探测网络主机存活。
'''
import os
import struct
import array
import time
import socket
import IPy
import threading
class SendPingThr(threading.Thread):
    '''
    发送ICMP请求报文的线程。
    参数:
        ipPool      -- 可迭代的IP地址池
        icmpPacket  -- 构造的icmp报文
        icmpSocket  -- icmp套字接
        timeout     -- 设置发送超时
    '''
    def __init__(self, ipPool, icmpPacket, icmpSocket, timeout=3):
        threading.Thread.__init__(self)
        self.Sock = icmpSocket
        self.ipPool = ipPool
        self.packet = icmpPacket
        self.timeout = timeout
        self.Sock.settimeout( timeout + 3 )
    def run(self):
        time.sleep(0.01)  #等待接收线程启动
        for ip in self.ipPool:
            try:
                self.Sock.sendto(self.packet, (ip, 0))
            except socket.timeout:
                break
        time.sleep(self.timeout)
class Nscan:
    '''
    参数:
        timeout    -- Socket超时,默认3秒
        IPv6       -- 是否是IPv6,默认为False
    '''
    def __init__(self, timeout=3, IPv6=False):
        self.timeout = timeout
        self.IPv6 = IPv6
        self.__data = struct.pack('d', time.time())   #用于ICMP报文的负荷字节(8bit)
        self.__id = os.getpid()   #构造ICMP报文的ID字段,无实际意义
    @property   #属性装饰器
    def __icmpSocket(self):
        '''创建ICMP Socket'''
        if not self.IPv6:
            Sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.getprotobyname("icmp"))
        else:
            Sock = socket.socket(socket.AF_INET6, socket.SOCK_RAW, socket.getprotobyname("ipv6-icmp"))
        return Sock
    def __inCksum(self, packet):
        '''ICMP 报文效验和计算方法'''
        if len(packet) & 1:
            packet = packet + '\0'
        words = array.array('h', packet)
        sum = 0
        for word in words:
            sum += (word & 0xffff)
        sum = (sum >> 16) + (sum & 0xffff)
        sum = sum + (sum >> 16)
        return (~sum) & 0xffff
    @property
    def __icmpPacket(self):
        '''构造 ICMP 报文'''
        if not self.IPv6:
            header = struct.pack('bbHHh', 8, 0, 0, self.__id, 0) # TYPE、CODE、CHKSUM、ID、SEQ
        else:
            header = struct.pack('BbHHh', 128, 0, 0, self.__id, 0)
        packet = header + self.__data     # packet without checksum
        chkSum = self.__inCksum(packet) # make checksum
        if not self.IPv6:
            header = struct.pack('bbHHh', 8, 0, chkSum, self.__id, 0)
        else:
            header = struct.pack('BbHHh', 128, 0, chkSum, self.__id, 0)
        return header + self.__data   # packet *with* checksum
    def isUnIP(self, IP):
        '''判断IP是否是一个合法的单播地址'''
        IP = [int(x) for x in IP.split('.') if x.isdigit()]
        if len(IP) == 4:
            if (0 < IP[0] < 223 and IP[0] != 127 and IP[1] < 256 and IP[2] < 256 and 0 < IP[3] < 255):
                return True
        return False
    def makeIpPool(self, startIP, lastIP):
        '''生产 IP 地址池'''
        IPver = 6 if self.IPv6 else 4
        intIP = lambda ip: IPy.IP(ip).int()
        ipPool = {IPy.intToIp(ip, IPver) for ip in range(intIP(startIP), intIP(lastIP)+1)}
        return {ip for ip in ipPool if self.isUnIP(ip)}
    def mPing(self, ipPool):
        '''利用ICMP报文探测网络主机存活
        参数:
            ipPool  -- 可迭代的IP地址池
        '''
        Sock = self.__icmpSocket
        Sock.settimeout(self.timeout)
        packet = self.__icmpPacket
        recvFroms = set()   #接收线程的来源IP地址容器
        sendThr = SendPingThr(ipPool, packet, Sock, self.timeout)
        sendThr.start()
        while True:
            try:
                recvFroms.add(Sock.recvfrom(1024)[1][0])
            except Exception:
                pass
            finally:
                if not sendThr.isAlive():
                    break
        return recvFroms & ipPool
if __name__=='__main__':
    s = Nscan()
    ipPool = s.makeIpPool('192.168.0.1', '192.168.0.254')
    print( s.mPing(ipPool) )
Python 相关文章推荐
Python中threading模块join函数用法实例分析
Jun 04 Python
使用paramiko远程执行命令、下发文件的实例
Oct 01 Python
Python简单生成随机姓名的方法示例
Dec 27 Python
Android基于TCP和URL协议的网络编程示例【附demo源码下载】
Jan 23 Python
在cmder下安装ipython以及环境的搭建
Oct 19 Python
python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)
May 30 Python
python实现视频分帧效果
May 31 Python
python实现多进程通信实例分析
Sep 01 Python
Python发起请求提示UnicodeEncodeError错误代码解决方法
Apr 21 Python
如何在python中判断变量的类型
Jul 29 Python
pytorch加载语音类自定义数据集的方法教程
Nov 10 Python
python库Tsmoothie模块数据平滑化异常点抓取
Jun 10 Python
python中mechanize库的简单使用示例
Jan 10 #Python
python使用新浪微博api上传图片到微博示例
Jan 10 #Python
python发腾讯微博代码分享
Jan 10 #Python
python实现2014火车票查询代码分享
Jan 10 #Python
python抓取豆瓣图片并自动保存示例学习
Jan 10 #Python
python文件比较示例分享
Jan 10 #Python
python发送伪造的arp请求
Jan 09 #Python
You might like
PHP 和 HTML
2006/10/09 PHP
jQuery学习3:操作元素属性和特性
2010/02/07 Javascript
两个比较有用的Javascript工具函数代码
2010/02/17 Javascript
用jQuery获取IE9下拉框默认值问题探讨
2013/07/22 Javascript
javascript使用数组的push方法完成快速排序
2014/09/15 Javascript
Jquery 实现table样式的设定
2015/01/28 Javascript
nodejs URL模块操作URL相关方法介绍
2015/03/03 NodeJs
基于JS实现的倒计时程序实例
2015/07/24 Javascript
深入理解jquery跨域请求方法
2016/05/18 Javascript
Angular的事件和表单详解
2016/12/26 Javascript
jQuery实现一个简单的轮播图
2017/02/19 Javascript
vue2项目使用sass的示例代码
2017/06/28 Javascript
Angularjs 事件指令详细整理
2017/07/27 Javascript
详谈DOM简介及节点、属性、查找节点的方法
2017/11/16 Javascript
VUE DOM加载后执行自定义事件的方法
2018/09/07 Javascript
angularjs的单选框+ng-repeat的实现方法
2018/09/12 Javascript
vue发送ajax请求详解
2018/10/09 Javascript
使用js实现单链解决前端队列问题的方法
2020/02/03 Javascript
vue实现虚拟列表功能的代码
2020/07/28 Javascript
[02:38]DOTA2亚洲邀请赛 IG战队巡礼
2015/02/03 DOTA
[01:13:18]Secret vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
详解Python中的type()方法的使用
2015/05/21 Python
python实现五子棋人机对战游戏
2020/03/25 Python
python numpy之np.random的随机数函数使用介绍
2019/10/06 Python
Django实现网页分页功能
2019/10/31 Python
基于virtualenv创建python虚拟环境过程图解
2020/03/30 Python
pytorch中的weight-initilzation用法
2020/06/24 Python
解决Pymongo insert时会自动添加_id的问题
2020/12/05 Python
CSS3实现文字描边的2种方法(小结)
2020/02/14 HTML / CSS
利用HTML5中的Canvas绘制一张笑脸的教程
2015/05/07 HTML / CSS
介绍一下XMLHttpRequest对象
2012/02/12 面试题
文言文形式的学生求职信
2013/12/03 职场文书
《陈毅探母》教学反思
2014/05/01 职场文书
党员批评与自我批评范文
2014/09/23 职场文书
python字典的元素访问实例详解
2021/07/21 Python
nginx lua 操作 mysql
2022/05/15 Servers