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爬虫框架Scrapy安装使用步骤
Apr 01 Python
wxPython使用系统剪切板的方法
Jun 16 Python
Python搭建HTTP服务器和FTP服务器
Mar 09 Python
最近Python有点火? 给你7个学习它的理由!
Jun 26 Python
Python设计实现的计算器功能完整实例
Aug 18 Python
Python基于回溯法子集树模板解决马踏棋盘问题示例
Sep 11 Python
Django获取该数据的上一条和下一条方法
Aug 12 Python
导入tensorflow:ImportError: libcublas.so.9.0 报错
Jan 06 Python
pytorch 中pad函数toch.nn.functional.pad()的用法
Jan 08 Python
python中如何使用insert函数
Jan 09 Python
Python 利用OpenCV给照片换底色的示例代码
Aug 03 Python
解决pytorch 数据类型报错的问题
Mar 03 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读取javascript设置的cookies的代码
2010/04/12 PHP
php数组去重的函数代码
2013/02/03 PHP
thinkphp实现面包屑导航(当前位置)例子分享
2014/05/10 PHP
PHP中SimpleXML函数用法分析
2014/11/26 PHP
php两种无限分类方法实例
2015/04/21 PHP
详解PHP5.6.30与Apache2.4.x配置
2017/06/02 PHP
JS 文字符串转换unicode编码函数
2009/05/30 Javascript
jquery CSS选择器笔记
2010/03/29 Javascript
基于jquery的button默认enter事件(回车事件)。
2011/05/18 Javascript
IE与Firefox在JavaScript上的7个不同句法分享
2011/10/30 Javascript
可在线编辑网页文字效果代码(单击)
2013/03/02 Javascript
JavaScript实现给按钮加上双重动作的方法
2015/08/14 Javascript
Jquery实现简单的轮播效果(代码管用)
2016/03/14 Javascript
javascript实现一个网页加载进度loading
2017/01/04 Javascript
强大的 Angular 表单验证功能详细介绍
2017/05/23 Javascript
vue展示dicom文件医疗系统的实现代码
2018/08/27 Javascript
python实现查找excel里某一列重复数据并且剔除后打印的方法
2015/05/26 Python
Python读写unicode文件的方法
2015/07/10 Python
python爬虫框架talonspider简单介绍
2017/06/09 Python
Python+Django搭建自己的blog网站
2018/03/13 Python
Python实现正则表达式匹配任意的邮箱方法
2018/12/20 Python
python实现静态web服务器
2019/09/03 Python
HTML5 manifest离线缓存的示例代码
2018/08/08 HTML / CSS
韩国江南富人区高端时尚百货商场:Galleria(格乐丽雅)
2018/03/27 全球购物
Oakley西班牙官方商店:太阳眼镜和男女运动服
2019/04/26 全球购物
优秀实习自我鉴定
2013/12/04 职场文书
班组长安全生产职责
2013/12/16 职场文书
装修施工安全责任书
2014/07/24 职场文书
员工教育培训协议书
2014/09/27 职场文书
标准离婚协议书范文下载
2014/11/30 职场文书
业务员管理制度范本
2015/08/06 职场文书
js之ajax文件上传
2021/05/13 Javascript
vue+springboot实现登录验证码
2021/05/27 Vue.js
Python趣味爬虫之用Python实现智慧校园一键评教
2021/05/28 Python
Spring Boot两种全局配置和两种注解的操作方法
2021/06/29 Java/Android
Ruby处理CSV数据方法详解
2022/04/18 Ruby