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的汉字转GBK码实现代码
Feb 19 Python
Python和GO语言实现的消息摘要算法示例
Mar 10 Python
使用Python的Flask框架来搭建第一个Web应用程序
Jun 04 Python
python定向爬取淘宝商品价格
Feb 27 Python
Python实现对文件进行单词划分并去重排序操作示例
Jul 10 Python
Python 存储字符串时节省空间的方法
Apr 23 Python
python中 * 的用法详解
Jul 10 Python
使用Python和Scribus创建一个RGB立方体的方法
Jul 17 Python
numpy np.newaxis 的实用分享
Nov 30 Python
Python jieba库分词模式实例用法
Jan 13 Python
Python3.9.1中使用match方法详解
Feb 08 Python
python定义具名元组实例操作
Feb 28 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 生成文字png图片的代码
2011/04/17 PHP
[原创]php简单防盗链验证实现方法
2016/07/09 PHP
jquery 指南/入门基础
2007/11/30 Javascript
JavaScript的9个陷阱及评点分析
2008/05/16 Javascript
JS支持带x身份证号码验证函数
2008/08/10 Javascript
仅IE不支持setTimeout/setInterval函数的第三个以上参数
2011/05/25 Javascript
JS可以控制样式的名称写法一览
2014/01/16 Javascript
JavaScript中双叹号(!!)作用示例介绍
2014/04/10 Javascript
浅析js中substring和substr的方法
2015/11/09 Javascript
JavaScript实现页面定时刷新(定时器,meta)
2016/10/12 Javascript
JavaScript中匿名函数的递归调用
2017/01/22 Javascript
vue使用watch 观察路由变化,重新获取内容
2017/03/08 Javascript
javascript 正则表达式分组、断言详解
2017/04/20 Javascript
vue2.0使用swiper组件实现轮播的示例代码
2018/03/03 Javascript
vue计算属性及使用详解
2018/04/02 Javascript
vue router+vuex实现首页登录验证判断逻辑
2018/05/17 Javascript
JS通过位运算实现权限加解密
2018/08/14 Javascript
JS随机密码生成算法
2019/09/23 Javascript
JS自定义滚动条效果
2020/03/13 Javascript
[02:31]DOTA2帕克 英雄基础教程
2013/11/26 DOTA
python定时器使用示例分享
2014/02/16 Python
Python之pandas读写文件乱码的解决方法
2018/04/20 Python
基于数据归一化以及Python实现方式
2018/07/11 Python
Django获取应用下的所有models的例子
2019/08/30 Python
python动态视频下载器的实现方法
2019/09/16 Python
python实现井字棋小游戏
2020/03/04 Python
使用Python爬取弹出窗口信息的实例
2020/03/14 Python
python向企业微信发送文字和图片消息的示例
2020/09/28 Python
python matplotlib工具栏源码探析三之添加、删除自定义工具项的案例详解
2021/02/25 Python
美国复古街头服饰精品店:Need Supply Co.
2017/02/22 全球购物
德国狗狗用品在线商店:Schecker
2017/03/17 全球购物
德国EGOIST网店:销售畅销的设计师品牌
2017/04/18 全球购物
Rossignol金鸡美国官网:始于1907年法国百年雪具品牌
2019/03/06 全球购物
英文简历自荐信范文
2013/12/11 职场文书
创优争先心得体会
2014/09/11 职场文书
2015年社区卫生工作总结
2015/04/21 职场文书