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 Deque 模块使用详解
Jul 04 Python
在Python3中初学者应会的一些基本的提升效率的小技巧
Mar 31 Python
python内存管理分析
Apr 08 Python
Python三级目录展示的实现方法
Sep 28 Python
用python写个自动SSH登录远程服务器的小工具(实例)
Jun 17 Python
Python中关键字global和nonlocal的区别详解
Sep 03 Python
python lxml中etree的简单应用
May 10 Python
Python生态圈图像格式转换问题(推荐)
Dec 02 Python
使用python-pptx包批量修改ppt格式的实现
Feb 14 Python
浅析Python __name__ 是什么
Jul 07 Python
Python 多进程、多线程效率对比
Nov 19 Python
pytorch中[..., 0]的用法说明
May 20 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
兼容firefox,chrome的网页灰度效果
2011/08/08 PHP
PHP获取和操作配置文件php.ini的几个函数介绍
2013/06/24 PHP
PHP错误Parse error: syntax error, unexpected end of file in test.php on line 12解决方法
2014/06/23 PHP
PHP生成短网址方法汇总
2016/07/12 PHP
jquery tab插件制作实现代码
2010/06/22 Javascript
javascript针对DOM的应用分析(三)
2012/04/15 Javascript
通过正则格式化url查询字符串实现代码
2012/12/28 Javascript
jQuery之选择组件的深入解析
2013/06/19 Javascript
jQuery实现统计复选框选中数量
2014/11/24 Javascript
JavaScript实现将数组中所有元素连接成一个字符串的方法
2015/04/06 Javascript
JavaScript_object基础入门(必看篇)
2016/06/13 Javascript
深入剖析JavaScript面向对象编程
2016/07/12 Javascript
关于Vue.js一些问题和思考学习笔记(1)
2016/12/02 Javascript
谈谈JavaScript中super(props)的重要性
2019/02/12 Javascript
vue elementUI table 自定义表头和行合并的实例代码
2019/05/22 Javascript
bootstrap-table后端分页功能完整实例
2020/06/01 Javascript
Vue Render函数原理及代码实例解析
2020/07/30 Javascript
浅谈JSON5解决了JSON的两大痛点
2020/12/14 Javascript
Python从单元素字典中获取key和value的实例
2018/12/31 Python
详解Python中is和==的区别
2019/03/21 Python
Python使用到第三方库PyMuPDF图片与pdf相互转换
2019/05/03 Python
Python解析json代码实例解析
2019/11/25 Python
pytorch中的inference使用实例
2020/02/20 Python
Python 在 VSCode 中使用 IPython Kernel 的方法详解
2020/09/05 Python
css3实例教程 一款纯css3实现的环形导航菜单
2014/10/20 HTML / CSS
德国婴儿服装和婴儿用品购买网站:Baby Sweets
2019/12/08 全球购物
Muziker英国:中欧最大的音乐家商店
2020/02/05 全球购物
COSETTE官网:奢华,每天
2020/03/22 全球购物
Sunglass Hut巴西网上商店:男女太阳镜
2020/10/04 全球购物
技术比武方案
2014/05/19 职场文书
社区巾帼文明岗事迹材料
2014/06/03 职场文书
2014年国庆节演讲稿
2014/09/19 职场文书
郭明义电影观后感
2015/06/08 职场文书
MySQL的join buffer原理
2021/04/29 MySQL
pytorch训练神经网络爆内存的解决方案
2021/05/22 Python
Python操作CSV格式文件的方法大全
2021/07/15 Python