用python实现ping
- #!/usr/bin/env python
- #coding=utf-8
- import os
- import argparse
- import socket
- import struct
- import select
- import time
- ICMP_ECHO_REQUEST = 8 # Platform specific
- DEFAULT_TIMEOUT = 2
- DEFAULT_COUNT = 4
- class Pinger(object):
- """
- Pings to a host -- the Pythonic way
- """
- def __init__(self, target_host, count=DEFAULT_COUNT, timeout=DEFAULT_TIMEOUT):
- self.target_host = target_host
- self.count = count
- self.timeout = timeout
- def do_checksum(self, source_string):
- """
- Verify the packet integritity
- """
- sum = 0
- max_count = (len(source_string)/2)*2
- count = 0
- while count < max_count: # 分割数据每两比特(16bit)为一组
- val = ord(source_string[count + 1])*256 + ord(source_string[count])
- sum = sum + val
- sum = sum & 0xffffffff
- count = count + 2
- if max_count<len(source_string): # 如果数据长度为基数,则将最后一位单独相加
- sum = sum + ord(source_string[len(source_string) - 1])
- sum = sum & 0xffffffff
- sum = (sum >> 16) + (sum & 0xffff) # 将高16位与低16位相加直到高16位为0
- sum = sum + (sum >> 16)
- answer = ~sum
- answer = answer & 0xffff
- answer = answer >> 8 | (answer << 8 & 0xff00)
- return answer # 返回的是十进制整数
- def receive_ping(self, sock, ID, timeout):
- """
- Receive ping from the socket.
- """
- time_remaining = timeout
- while True:
- start_time = time.time()
- readable = select.select([sock], [], [], time_remaining)
- time_spent = (time.time() - start_time)
- if readable[0] == []: # Timeout
- return
- time_received = time.time()
- recv_packet, addr = sock.recvfrom(1024)
- icmp_header = recv_packet[20:28]
- type, code, checksum, packet_ID, sequence = struct.unpack(
- "bbHHh", icmp_header
- )
- if packet_ID == ID:
- bytes_In_double = struct.calcsize("d")
- time_sent = struct.unpack("d", recv_packet[28:28 + bytes_In_double])[0]
- return time_received - time_sent
- time_remaining = time_remaining - time_spent
- if time_remaining <= 0:
- return
- def send_ping(self, sock, ID):
- #Send ping to the target host
- target_addr = socket.gethostbyname(self.target_host)
- my_checksum = 0
- # Create a dummy heder with a 0 checksum.
- header = struct.pack("bbHHh", ICMP_ECHO_REQUEST, 0, my_checksum, ID, 1)
- bytes_In_double = struct.calcsize("d")
- data = (192 - bytes_In_double) * "Q"
- data = struct.pack("d", time.time()) + data
- # Get the checksum on the data and the dummy header.
- my_checksum = self.do_checksum(header + data)
- header = struct.pack(
- "bbHHh", ICMP_ECHO_REQUEST, 0, socket.htons(my_checksum), ID, 1
- )
- packet = header + data
- sock.sendto(packet, (target_addr, 1))
- def ping_once(self):
- """
- Returns the delay (in seconds) or none on timeout.
- """
- icmp = socket.getprotobyname("icmp")
- try:
- sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, icmp)
- except socket.error, (errno, msg):
- if errno == 1:
- # Not superuser, so operation not permitted
- msg += "ICMP messages can only be sent from root user processes"
- raise socket.error(msg)
- except Exception, e:
- print "Exception: %s" %(e)
- my_ID = os.getpid() & 0xFFFF
- self.send_ping(sock, my_ID)
- delay = self.receive_ping(sock, my_ID, self.timeout)
- sock.close()
- return delay
- def ping(self):
- """
- Run the ping process
- """
- for i in xrange(self.count):
- print "Ping to %s..." % self.target_host,
- try:
- delay = self.ping_once()
- except socket.gaierror, e:
- print "Ping failed. (socket error: '%s')" % e[1]
- break
- if delay == None:
- print "Ping failed. (timeout within %ssec.)" % self.timeout
- else:
- delay = delay * 1000
- print "Get ping in %0.4fms" % delay
- if __name__ == '__main__':
- parser = argparse.ArgumentParser(description='Python ping')
- parser.add_argument('--target-host', action="store", dest="target_host", required=True)
- given_args = parser.parse_args()
- target_host = given_args.target_host
- pinger = Pinger(target_host=target_host, count=5, timeout=5)
- pinger.ping()
用python实现ping的更多相关文章
- python 多线程 ping
python 多线程 ping 多线程操作可按如下例子实现 #!/usr/bin/env python #encoding: utf8 import subprocess from threading ...
- Python windows ping
# -*- coding: utf-8 -*- import os # 参考文档: # Ping to a specific IP address using python [duplicate] # ...
- HCNP学习笔记之ICMP协议与ping原理以及用Python实现ping
一.ICMP协议分析 ICMP:Internet控制报文协议.由于IP协议并不是一个可靠的协议,它不保证数据被成功送达,那么,如何才能保证数据的可靠送达呢? 这里就需要使用到一个重要的协议模块ICMP ...
- python 多线程ping大量服务器在线情况
需要ping一个网段所有机器的在线情况,shell脚步运行时间太长,用python写个多线程ping吧,代码如下: #!/usr/bin/python #coding=utf-8 ''' Create ...
- python 批量ping服务器
最近在https://pypi.python.org/pypi/mping/0.1.2找到了一个python包,可以用它来批量ping服务器,它是中国的大神写的,支持单个服务器.将服务器IP写在txt ...
- python 批量ping脚本不能用os.system
os.system(cmd)通过执行命令会得到返回值. ping通的情况下返回值为0. ping不通的情况: 1.请求超时,返回值1 2.无法访问目标主机,返回值为 0,和ping通返回值相同 所 ...
- python获取PING结果
# -*- coding: utf-8 -*- import subprocess import re def get_ping_result(ip_address): p = subprocess. ...
- python剑指网络
>>> #获取hostname ... >>> host_name=socket.gethostname() >>> print "%s ...
- python剑指网络篇一
#coding:utf-8 __author__ = 'similarface' #!/usr/bin/env python import socket #二进制和ASCII互转及其它进制转换 fro ...
随机推荐
- Mysql 删除数据表重复行
准备示例数据 以下sql创建表,并将示例数据插入到用于演示的contacts表中. CREATE TABLE contacts ( id INT PRIMARY KEY AUTO_INCREMENT, ...
- Python基础学习总结(一)
1.变量和数据类型 1.1变量 1.每个变量都存储了一个值——与变量相关联的信息. 2.变量不仅可以为整数或浮点数,还可以是字符串,可以是任意数据类型. 1.1.1变量的命名和使用 变量名只能包含字母 ...
- Effective C++ .17 函数调用时的资源管理
以书上的代码为例 processWidget(shared_ptr<Widget>(new Widget), priority()) 虽然使用了智能指针来管理资源但是,由于参数值计算顺序的 ...
- python 数据结构应用
- Java—IO流 字符流
java的文本(char)是16位无符号整数,是字符的unicode编码(双字节编码). 文件是byte byte byte ... 的数据序列. 文本文件是文本(char)序列按照某种编码方案(uf ...
- cookie的初识和运用(js和jq)
cookie是什么 cookie是浏览器提供的一种机制,它将document 对象的cookie属性提供给JavaScript.可以由JavaScript对其进行控制,而并不是JavaScript本身 ...
- update_dctcp_alpha
/* + * Update dctcp alpha based on the ecn bit in the received packet. + * This procedure is called ...
- Apache POI使用
使用apache poi解析 Excel文件: package excellucene; import java.io.File; import java.io.FileInputStream; im ...
- 【Leetcode】【Hard】Search in Rotated Sorted Array
Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...
- Elasticsearch、MongoDB和Hadoop比较
IT界在过去几年中出现了一个有趣的现象.很多新的技术出现并立即拥抱了“大数据”.稍微老一点的技术也会将大数据添进自己的特性,避免落大部队太远,我们看到了不同技术之间的边际的模糊化.假如你有诸如Elas ...