python实现ping的方法


Posted in Python onJuly 06, 2015

本文实例讲述了python实现ping的方法。分享给大家供大家参考。具体如下:

#!/usr/bin/env python
#coding:utf-8
import os, sys, socket, struct, select, time
# From /usr/include/linux/icmp.h; your milage may vary.
ICMP_ECHO_REQUEST = 8 # Seems to be the same on Solaris.
def checksum(source_string):
  """
  I'm not too confident that this is right but testing seems
  to suggest that it gives the same answers as in_cksum in ping.c
  """
  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 # Necessary?
    count = count + 2
  if countTo<len(source_string):
    sum = sum + ord(source_string[len(source_string) - 1])
    sum = sum & 0xffffffff # Necessary?
  sum = (sum >> 16) + (sum & 0xffff)
  sum = sum + (sum >> 16)
  answer = ~sum
  answer = answer & 0xffff
  # Swap bytes. Bugger me if I know why.
  answer = answer >> 8 | (answer << 8 & 0xff00)
  return answer
def receive_one_ping(my_socket, ID, timeout):
  """
  receive the ping from the socket.
  """
  timeLeft = timeout
  while True:
    startedSelect = time.time()
    whatReady = select.select([my_socket], [], [], timeLeft)
    howLongInSelect = (time.time() - startedSelect)
    if whatReady[0] == []: # Timeout
      return
    timeReceived = time.time()
    recPacket, addr = my_socket.recvfrom(1024)
    icmpHeader = recPacket[20:28]
    type, code, checksum, packetID, sequence = struct.unpack(
      "bbHHh", icmpHeader
    )
    if packetID == ID:
      bytesInDouble = struct.calcsize("d")
      timeSent = struct.unpack("d", recPacket[28:28 + bytesInDouble])[0]
      return timeReceived - timeSent
    timeLeft = timeLeft - howLongInSelect
    if timeLeft <= 0:
      return
def send_one_ping(my_socket, dest_addr, ID):
  """
  Send one ping to the given >dest_addr<.
  """
  dest_addr = socket.gethostbyname(dest_addr)
  # Header is type (8), code (8), checksum (16), id (16), sequence (16)
  my_checksum = 0
  # Make a dummy heder with a 0 checksum.
  header = struct.pack("bbHHh", ICMP_ECHO_REQUEST, 0, my_checksum, ID, 1) #压包
  #a1 = struct.unpack("bbHHh",header)  #my test
  bytesInDouble = struct.calcsize("d")
  data = (192 - bytesInDouble) * "Q"
  data = struct.pack("d", time.time()) + data
  # Calculate the checksum on the data and the dummy header.
  my_checksum = checksum(header + data)
  # Now that we have the right checksum, we put that in. It's just easier
  # to make up a new header than to stuff it into the dummy.
  header = struct.pack("bbHHh", ICMP_ECHO_REQUEST, 0, socket.htons(my_checksum), ID, 1)
  packet = header + data
  my_socket.sendto(packet, (dest_addr, 1)) # Don't know about the 1
def do_one(dest_addr, timeout):
  """
  Returns either the delay (in seconds) or none on timeout.
  """
  icmp = socket.getprotobyname("icmp")
  try:
    my_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, icmp)
  except socket.error, (errno, msg):
    if errno == 1:
      # Operation not permitted
      msg = msg + (
        " - Note that ICMP messages can only be sent from processes"
        " running as root."
      )
      raise socket.error(msg)
    raise # raise the original error
  my_ID = os.getpid() & 0xFFFF
  send_one_ping(my_socket, dest_addr, my_ID)
  delay = receive_one_ping(my_socket, my_ID, timeout)
  my_socket.close()
  return delay
def verbose_ping(dest_addr, timeout = 2, count = 100):
  """
  Send >count< ping to >dest_addr< with the given >timeout< and display
  the result.
  """
  for i in xrange(count):
    print "ping %s..." % dest_addr,
    try:
      delay = do_one(dest_addr, timeout)
    except socket.gaierror, e:
      print "failed. (socket error: '%s')" % e[1]
      break
    if delay == None:
      print "failed. (timeout within %ssec.)" % timeout
    else:
      delay = delay * 1000
      print "get ping in %0.4fms" % delay
if __name__ == '__main__':
  verbose_ping("www.163.com",2,1)

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
使用Python下载Bing图片(代码)
Nov 07 Python
Python中关键字is与==的区别简述
Jul 31 Python
Python脚本处理空格的方法
Aug 08 Python
Collatz 序列、逗号代码、字符图网格实例
Jun 22 Python
使用Django Form解决表单数据无法动态刷新的两种方法
Jul 14 Python
Python 实现一行输入多个值的方法
Apr 21 Python
python实现人民币大写转换
Jun 20 Python
Python3 导入上级目录中的模块实例
Feb 16 Python
Window系统下Python如何安装OpenCV库
Mar 05 Python
Selenium启动Chrome时配置选项详解
Mar 18 Python
自定义实现 PyQt5 下拉复选框 ComboCheckBox的完整代码
Mar 30 Python
基于PyTorch实现一个简单的CNN图像分类器
May 29 Python
python删除指定类型(或非指定)的文件实例详解
Jul 06 #Python
python根据日期返回星期几的方法
Jul 06 #Python
python获取文件扩展名的方法
Jul 06 #Python
python创建临时文件夹的方法
Jul 06 #Python
Python中几个比较常见的名词解释
Jul 04 #Python
python检测是文件还是目录的方法
Jul 03 #Python
python生成随机密码或随机字符串的方法
Jul 03 #Python
You might like
mac下安装nginx和php
2013/11/04 PHP
php计算整个目录大小的方法
2015/06/01 PHP
PHP控制反转(IOC)和依赖注入(DI)
2017/03/13 PHP
创建无限极分类树型结构的简单方法
2017/06/20 PHP
phpMyAdmin通过密码漏洞留后门文件
2018/11/20 PHP
JavaScript中Math对象使用说明
2008/01/16 Javascript
ie下动态加态js文件的方法
2011/09/13 Javascript
js对象关系图 方便dom操作
2012/03/18 Javascript
Javascript根据指定下标或对象删除数组元素
2012/12/21 Javascript
js中的push和join方法使用介绍
2013/10/08 Javascript
JS将数字转换成三位逗号分隔的样式(示例代码)
2014/02/19 Javascript
jquery新的绑定事件机制on方法的使用方法
2014/04/15 Javascript
javascript打开word文档的方法
2014/04/16 Javascript
JavaScript实现彩虹文字效果的方法
2015/04/16 Javascript
js实现文字滚动效果
2016/03/03 Javascript
原生的强大DOM选择器querySelector介绍
2016/12/21 Javascript
Bootstrap select实现下拉框多选效果
2016/12/23 Javascript
Vue组件通信之Bus的具体使用
2017/12/28 Javascript
Mac下安装vue
2018/04/11 Javascript
微信小程序如何实现全局重新加载
2019/06/05 Javascript
Node.js API详解之 dns模块用法实例分析
2020/05/15 Javascript
JQuery获得内容和属性方法解析
2020/05/30 jQuery
在vue中使用Echarts画曲线图的示例
2020/10/03 Javascript
[58:11]守擂赛第二周擂主赛 DeMonsTer vs Leopard
2020/04/28 DOTA
python控制台显示时钟的示例
2014/02/24 Python
Python实现控制台输入密码的方法
2015/05/29 Python
python通过socket查询whois的方法
2015/07/18 Python
python机器学习之神经网络(三)
2017/12/20 Python
pandas DataFrame 行列索引及值的获取的方法
2019/07/02 Python
Python 实现将数组/矩阵转换成Image类
2020/01/09 Python
Pycharm及python安装详细步骤及PyCharm配置整理(推荐)
2020/07/31 Python
《雨点儿》教学反思
2014/04/14 职场文书
行政司机岗位职责
2015/04/10 职场文书
python如何读取.mtx文件
2021/04/22 Python
Vue监视数据的原理详解
2022/02/24 Vue.js
Win11如何设置右键单击显示所有选项?Win11右键单击显示所有选项设置教程
2022/04/08 数码科技