原文数据:
common_data.py
# -*- coding: utf-8 -*-
"""
#
# Authors: limanman
# OsChina: http://my.oschina.net/pydevops/
# Purpose:
#
"""
# 查询StatusHelper状态是否正常
statushelper_isalive = '''15 20 00 b0 61 63 61 38 35 33 33 34 31 31 31 36 34
65 39 36 2C 30 32 64 32 30 35 33 35 31 32 30 37 38 62 61 35 2C 30 36 37 37 34
65 64 64 34 66 63 36 39 37 66 61 2C 30 61 30 37 64 61 32 34 34 66 62 35 39 64
30 61 2C 38 63 61 33 66 64 66 32 65 64 39 62 66 32 64 66 2C 36 35 64 37 33 35
36 35 39 31 63 33 38 30 65 36 00'''
if __name__ == '__main__':
print statushelper_isalive
具体要求:
1.发送如上16进制数据包到UDP指定端口,线上状态查询服务器功能测试
代码实现:
# -*- coding: utf-8 -*-
"""
#
# Authors: limanman
# OsChina: http://my.oschina.net/pydevops/
# Purpose:
#
"""
import string
import socket
import struct
import blessings
from common_data import statushelper_isalive
# 转换为二进制字节流
def struct_pack(hex_strs):
"""Pack hex_strs to strs
Args:
hex_strs: hex string
Returns:
string
"""
all_strs = ''
hex_strs = hex_strs.replace('\n', ' ')
hex_list = hex_strs.split()
for cur_item in hex_list:
# 十六进制转换为10进制然后在组包二进制字节流
all_strs += struct.pack('B', int(cur_item, 16))
return all_strs
def main():
"""Main function."""
addr_info = ('x.x.x.x', 8777)
# 全局超时
socket.setdefaulttimeout(5)
socket_handler = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 组包
socket_strings = struct_pack(statushelper_isalive)
print repr(socket_strings)
# 改包
socket_strings = socket_strings.replace('0a07da244fb59d0a',
'0a07da244fb59d0a')
# 发包
socket_handler.sendto(socket_strings, addr_info)
# 格式输出
head_format = '%-*s%-*s'
server_width = 20
serial_width = int(TERMINAL.width) - 2 - server_width
print '='*int(TERMINAL.width)
print head_format % (serial_width, 'SerialNumber',
server_width, 'NatServer/StatusHelp')
print '='*int(TERMINAL.width)
# 遍历字节流
res_list = []
chr_strs = '.'.join([string.lowercase, string.digits])
while True:
try:
cur_data, _ = socket_handler.recvfrom(1024)
for cur_chr in cur_data:
if cur_chr in chr_strs:
res_list.append(cur_chr)
serial_num = ''.join(res_list[:16])
newnatserver = ''.join(res_list[16:])
print head_format % (serial_width, serial_num,
server_width, newnatserver)
del res_list[:]
except socket.timeout:
break
if __name__ == '__main__':
TERMINAL = blessings.Terminal()
main()