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 self,cls,decorator的理解
Jul 13 Python
python实现ftp客户端示例分享
Feb 17 Python
Python实现设置windows桌面壁纸代码分享
Mar 28 Python
python检测是文件还是目录的方法
Jul 03 Python
用virtualenv建立多个Python独立虚拟开发环境
Jul 06 Python
解决python nohup linux 后台运行输出的问题
May 11 Python
Python爬虫包BeautifulSoup简介与安装(一)
Jun 17 Python
Python os.rename() 重命名目录和文件的示例
Oct 25 Python
Jupyter notebook在mac:linux上的配置和远程访问的方法
Jan 14 Python
python滑块验证码的破解实现
Nov 10 Python
弄清Pytorch显存的分配机制
Dec 10 Python
教你使用Python获取QQ音乐某个歌手的歌单
Apr 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
《魔兽世界》惊魂幻象将获得调整
2020/03/08 其他游戏
php Http_Template_IT类库进行模板替换
2009/03/19 PHP
PHP封装的一个支持HTML、JS、PHP重定向的多功能跳转函数
2014/06/19 PHP
PHP和Mysql中转UTF8编码问题汇总
2015/10/10 PHP
php使用get_class_methods()函数获取分类的方法
2016/07/20 PHP
在 Laravel 中 “规范” 的开发短信验证码发送功能
2017/10/26 PHP
PHP基于mcript扩展实现对称加密功能示例
2019/02/21 PHP
PHP 实现文件压缩解压操作的方法
2019/06/14 PHP
JavaScript 更严格的相等 [译]
2012/09/20 Javascript
Javascript常用小技巧汇总
2015/06/24 Javascript
Bootstrap每天必学之工具提示(Tooltip)插件
2016/04/26 Javascript
解决前端跨域问题方案汇总
2016/11/20 Javascript
Jquery on绑定的事件 触发多次实例代码
2016/12/08 Javascript
JavaScript数据结构之二叉树的计数算法示例
2017/04/13 Javascript
详解VUE中常用的几种import(模块、文件)引入方式
2018/07/03 Javascript
p5.js绘制创意自画像
2019/11/04 Javascript
基于js判断浏览器是否支持webGL
2020/04/18 Javascript
js实现盒子移动动画效果
2020/08/09 Javascript
python3读取MySQL-Front的MYSQL密码
2017/05/03 Python
python生成词云的实现方法(推荐)
2017/06/13 Python
tensorflow 使用flags定义命令行参数的方法
2018/04/23 Python
关于numpy中eye和identity的区别详解
2019/11/29 Python
python正则表达式的懒惰匹配和贪婪匹配说明
2020/07/13 Python
OLEDBConnection和SQLConnection有什么区别
2013/05/31 面试题
小学生自我评价范例
2013/09/24 职场文书
和平主题的演讲稿
2014/01/12 职场文书
实习生自我评价
2014/01/18 职场文书
计算机专业职业生涯规划范文
2014/01/19 职场文书
给领导的检讨书
2014/02/16 职场文书
特教教师先进事迹
2014/05/21 职场文书
预防传染病方案
2014/06/14 职场文书
全国优秀教师事迹材料
2014/08/26 职场文书
个人租房协议书
2014/11/28 职场文书
浅谈mysql执行过程以及顺序
2021/05/12 MySQL
Mysql 用户权限管理实现
2021/05/25 MySQL
解决vue-router的beforeRouteUpdate不能触发
2022/04/14 Vue.js