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中的type()方法的使用
May 21 Python
matplotlib中legend位置调整解析
Dec 19 Python
python实现小球弹跳效果
May 10 Python
Python 一键制作微信好友图片墙的方法
May 16 Python
Python中Numpy mat的使用详解
May 24 Python
python调用并链接MATLAB脚本详解
Jul 05 Python
在django模板中实现超链接配置
Aug 21 Python
python django生成迁移文件的实例
Aug 31 Python
python实现智能语音天气预报
Dec 02 Python
Pytorch之保存读取模型实例
Dec 30 Python
Python基础之进程详解
May 21 Python
实操Python爬取觅知网素材图片示例
Nov 27 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代码串截取代码
2008/12/29 PHP
用mysql触发器自动更新memcache的实现代码
2009/10/11 PHP
10个简化PHP开发的工具
2014/12/25 PHP
js基于qrcode.js生成二维码的方法【附demo插件源码下载】
2016/12/28 PHP
PHP实现的大文件切割与合并功能示例
2018/04/10 PHP
js字符编码函数区别分析
2008/06/05 Javascript
JS location几个方法小姐
2008/07/09 Javascript
Javascript 代码也可以变得优美的实现方法
2009/06/22 Javascript
instanceof和typeof运算符的区别详解
2014/01/06 Javascript
JavaScript中的值是按值传递还是按引用传递问题探讨
2015/01/30 Javascript
jQuery插件imgAreaSelect基础讲解
2017/05/26 jQuery
js实现网页的两个input标签内的数值加减(示例代码)
2017/08/15 Javascript
细说webpack源码之compile流程-rules参数处理技巧(2)
2017/12/26 Javascript
jQuery HTML获取内容和属性操作实例分析
2020/05/20 jQuery
微信小程序实现打卡签到页面
2020/09/21 Javascript
[58:00]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第二场 2月7日
2021/03/11 DOTA
ubuntu系统下 python链接mysql数据库的方法
2017/01/09 Python
详解python中的文件与目录操作
2017/07/11 Python
不同版本中Python matplotlib.pyplot.draw()界面绘制异常问题的解决
2017/09/24 Python
python实现排序算法解析
2018/09/08 Python
python变量的存储原理详解
2019/07/10 Python
python torch.utils.data.DataLoader使用方法
2020/04/02 Python
详解HTML5中rel属性的prefetch预加载功能使用
2016/05/06 HTML / CSS
Ray-Ban雷朋瑞典官方网站:全球领先的太阳眼镜品牌
2019/08/22 全球购物
美国眼镜网站:LensCrafters
2020/01/19 全球购物
中东奢侈品购物网站:Ounass
2020/09/02 全球购物
路政管理专业推荐信
2013/11/11 职场文书
自我评价个人范文
2013/12/16 职场文书
就业协议书的作用
2014/04/11 职场文书
机械专业求职信范文
2014/07/15 职场文书
祖国在我心中演讲稿600字
2014/09/23 职场文书
2014乡镇领导班子四风对照检查材料思想汇报
2014/10/05 职场文书
服务承诺书
2015/01/19 职场文书
健康教育主题班会
2015/08/14 职场文书
python urllib库的使用详解
2021/04/13 Python
MySQL外键约束(Foreign Key)案例详解
2022/06/28 MySQL