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发送邮件示例(支持中文邮件标题)
Feb 16 Python
Python3基础之条件与循环控制实例解析
Aug 13 Python
Python3的urllib.parse常用函数小结(urlencode,quote,quote_plus,unquote,unquote_plus等)
Sep 18 Python
TensorFlow实现RNN循环神经网络
Feb 28 Python
Python http接口自动化测试框架实现方法示例
Dec 06 Python
Python 从一个文件中调用另一个文件的类方法
Jan 10 Python
通过 Django Pagination 实现简单分页功能
Nov 11 Python
python3.x 生成3维随机数组实例
Nov 28 Python
keras topN显示,自编写代码案例
Jul 03 Python
如何通过python检查文件是否被占用
Dec 18 Python
详解Python+Selenium+ChromeDriver的配置和问题解决
Jan 19 Python
python编程简单几行代码实现视频转换Gif示例
Oct 05 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生成静态页
2006/11/25 PHP
Thinkphp5行为使用方法汇总
2017/12/21 PHP
免费空间广告万能消除代码
2006/09/04 Javascript
Javascript动态绑定事件的简单实现代码
2010/12/25 Javascript
js substr、substring和slice使用说明小记
2011/09/15 Javascript
web性能优化之javascript性能调优
2012/12/28 Javascript
cookie的复制与使用记住用户名实现代码
2013/11/04 Javascript
JQuery中使文本框获得焦点的方法实例分析
2015/02/28 Javascript
Actionscript与javascript交互实例程序(修改)
2016/09/22 Javascript
JS搜狐面试题分析
2016/12/16 Javascript
vue select二级联动第二级默认选中第一个option值的实例
2018/01/10 Javascript
Vue-cli Eslint在vscode里代码自动格式化的方法
2018/02/23 Javascript
js input输入百分号保存数据库失败的解决方法
2018/05/26 Javascript
微信小程序网络请求封装示例
2018/07/24 Javascript
JavaScript折半查找(二分查找)算法原理与实现方法示例
2018/08/06 Javascript
Angular刷新当前页面的实现方法
2018/11/21 Javascript
详解Vue中CSS样式穿透问题
2019/09/12 Javascript
js实现带有动画的返回顶部
2020/08/09 Javascript
Python实现购物系统(示例讲解)
2017/09/13 Python
python实现简单聊天应用 python群聊和点对点均实现
2017/09/14 Python
pandas 对series和dataframe进行排序的实例
2018/06/09 Python
python批量下载抖音视频
2019/06/17 Python
Flask配置Cors跨域的实现
2019/07/12 Python
python如何实现从视频中提取每秒图片
2020/10/22 Python
Python模块汇总(常用第三方库)
2019/10/07 Python
python yield关键词案例测试
2019/10/15 Python
django实现支付宝支付实例讲解
2019/10/17 Python
Django实现CAS+OAuth2的方法示例
2019/10/30 Python
Python logging日志模块 配置文件方式
2020/07/12 Python
成品仓管员岗位职责
2013/12/11 职场文书
机械设计制造及其自动化专业求职信
2014/06/17 职场文书
小学生春游活动方案
2014/08/20 职场文书
团员年度个人总结
2015/02/26 职场文书
交通处罚决定书
2015/06/24 职场文书
2015年学校总务工作总结
2015/07/20 职场文书
Java实现HTML转为Word的示例代码
2022/06/28 Java/Android