标签:
用python脚本测试两个机器之间的udp的延迟与丢包情况
#!/usr/bin/python
#-*- coding:UTF-8 -*-
import socket
import struct
import random
import time
import logging
#from __future__ import division
logFile = "/tmp/check_wzry_%s.log" % time.strftime("%Y-%m-%d")
logging.basicConfig(level=logging.DEBUG,
format=‘%(asctime)s SrvZCheck [%(funcName)s] %(levelname)s %(message)s‘,
datefmt=‘%Y-%m-%d %H:%M:%S‘,
filename=logFile,
filemode=‘a‘)
TCP_RSP_CODE = {
0x00: "SUCCESS",
0x01: "SERVER_FAIL",
0x02: "NOT_ALLOWED",
0x03: "NETWORK_UNREACHABLE",
0x04: "HOST_UNREACHABLE",
0x05: "REFUSED",
0x06: "TTL_EXPIRED",
0x07: "COMMAND_NOT_SUPPORTED",
0x08: "ADDRESS_TYPE_NOT_SUPPORTED",
0x09: "REQUEST_ERROR",
0x0A: "ROUTE_ERROR",
0xEF: "UNKNOWN_ERROR"
}
CONNECTION_TIMEOUT = 500
CONNECTION_ERROR = 501
FORWARD_ERROR = 600
FORWARD_RSP_ERROR = 601
INTERNAL_ERROR = 400
SUCCESS = 0x00
class Client(object):
def __init__(self, sbServer, sbPort):
self.sbServer = sbServer
self.sbPort = sbPort
self.serverAddr = (sbServer, sbPort)
self.recvBuff = 1024
self.testStr = ‘subaoTest‘
self.tStrLen = len(self.testStr)
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
def setTimeout(self, t):
self.socket.settimeout(t)
def close(self):
return self.socket.close()
def connect(self):
pass
def __del__(self):
self.socket.close()
class WzryMeasure(Client):
def __init__(self, sbServer, sbPort):
super(WzryMeasure, self).__init__(sbServer, sbPort)
self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.idx = 2052
self.tid = 2053
def __createMeasureData(self):
ver = 0x01
cmd = 0x01
fin = 0xFE
return struct.pack("!2B2HB", ver, cmd, self.idx, self.tid, fin)
def __checkRspData(self, Data):
ver, rsp, idx, tid, fin = struct.unpack("!2B2HB", Data)
if rsp == 0x00 and fin == 0xFE:
return rsp
else:
logging.warning("response data not match, [str: %s, end: %s]" % (rsp, fin))
return rsp
def forwardData(self):
try:
# aaa = time.time()
self.setTimeout(1)
testData = self.__createMeasureData()
self.socket.sendto(testData, self.serverAddr)
rspData = self.socket.recv(self.recvBuff)
# bbb = time.time()
# print bbb - aaa
return self.__checkRspData(rspData)
except socket.timeout:
logging.exception("Conntion ‘%s:%s‘ Timeout" % self.serverAddr)
return CONNECTION_TIMEOUT
except socket.error, e:
super(WzryMeasure, self).close()
logging.exception(e)
return CONNECTION_ERROR
except Exception, e:
super(WzryMeasure, self).close()
logging.exception(e)
return INTERNAL_ERROR
def run(self):
return self.forwardData()
def run(obj, opt, echoServer):
ret = 0
for echo in echoServer:
echoParts = echo.split(‘:‘)
z = obj(opt.server, opt.port, echoParts[0], echoParts[1])
code = z.run()
ret = code
if code == 0:
break
print ret
def check_loss():
success_num = []
delay = []
for i in range(10):
now = time.time()
if Z.run() == 0:
last = time.time()
success_num.append(i)
every_delay = last - now
delay.append(every_delay)
return (10 - len(success_num))*10,sum(delay)/len(delay)
if __name__ == "__main__":
import optparse
parse = optparse.OptionParser(usage="usage: %prog [Options] echo_ip:echo echo_ip:port",
version="%prog 1.0")
parse.add_option("-s", "--server", dest="server", help="wzry ip", type="string" )
parse.add_option("-p", "--port", dest="port", action="store", type="int", help="wzry port")
parse.add_option("-P", "--testWzry", dest="prober", action="store_true",
help="Porber measure check", default=False)
parse.add_option("-L", "--check_loss", dest="loss", action="store_true",
help="check udp loss", default=False)
parse.add_option("-D", "--check_delay", dest="delay", action="store_true",
help="check udp delay", default=False)
opt, args = parse.parse_args()
Z = WzryMeasure(opt.server, opt.port)
if opt.loss:
print check_loss()[0]
elif opt.delay:
print check_loss()[1]
else:
print parse.print_help()
使用方法:延迟:demo.py -s $host -p $port -P -D delay
丢包:demo.py -s $host -p $port -P -L loss
标签:
原文地址:http://www.cnblogs.com/ylqh/p/5970715.html