マルチソケットクライアント接続serverをシミュレートしてコード圧力テストを行う


プロジェクトの中でCプログラムコードに対して圧力テストを行う必要があることに出会って、大量の同時関連新聞を模擬してserverに報告する必要があって、サービス側と対話して、サービス側の同時処理能力をテストして、本文はPythonを使って新聞を模擬してそして関連する同時セッションの創立を行う
目標:1、インタフェースプロトコルに従ってsocketメッセージをシミュレートする;2、マルチソケットセッションを確立してC言語に書かれたサービス側に接続し、圧力テストを行う.
主な問題に遭遇する:1、システムは1000より大きい同時数をサポートしないで、システムパラメータを調整する必要があります、ulimit-n 1024、具体的な設定はここで詳しく説明しません
コードは次のとおりです.
#/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: MengJie Qian

import datetime,time,os
import socket, struct,random

msg_head = 'AA766200010000'
status = '01'
gyro = '808A00000000'
other = '00' * 5 + '00' + '52'
#data='aa76b12f900064110407172239001a13070e3c00662600dcbe02b554010001800180060a901b6e00f1be5f5d00000000000000003436303031383033323734393933370000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006144'

def int_hex(x):
    if type(x) == str:
        x_hex = hex(int(x))
    elif type(x) == int:
        x_hex = hex(x)
    else:
        print("Input a right number or string ...")
    return  x_hex[2:].zfill(2)

def get_date():
    #tm_year=2017, tm_mon=8, tm_mday=4, tm_hour=9, tm_min=4, tm_sec=49, tm_wday=4, tm_yday=216, tm_isdst=0)
    now = time.gmtime()
    year = str(now.tm_year)[2:]
    month = now.tm_mon
    day = now.tm_mday
    hour = now.tm_hour
    min = now.tm_min
    sec = now.tm_sec
    y = int_hex(year)

    mon= int_hex(month)
    d = int_hex(day)
    h = int_hex(hour)
    min = int_hex(min)
    s = int_hex(sec)
    return  '{0}{1}{2}{3}{4}{5}'.format(y,mon,d,h,min,s)

def long_lat_convert(*lat_long,high='300.05'):

    Dec_hex =''
    for dec in lat_long:
        Dec = float(dec)
        high = float(high)

        deg = int((Dec))
        Deg=hex(deg)[2:].zfill(2)
        Minutes = int((Dec - deg) * 60)
        Min=hex(Minutes)[2:].zfill(2)
        Seconds = int(str((Dec - deg) * 60).split('.')[1][:5])
        Sec=hex(Seconds)[2:].zfill(6)
        dec='01'+Deg+Min+Sec
        Dec_hex += dec

    h_int = int(high)
    h_deg = hex(h_int)[2:].zfill(4)
    h_float = int(str(high).split('.')[1])
    h_f= hex(h_float)[2:].zfill(2)
    h_hex = h_deg+h_f
    Dec_hex = Dec_hex + h_hex
    return  Dec_hex

def cell_convert(lac,ci):
    lac = int(lac)
    ci = int(ci)
    return hex(ci)[2:].zfill(8)+hex(lac)[2:].zfill(6)+'48'+'47'

def device_convert(phone_num,imsi):
    imsi = imsi.ljust(20,'0') 
    imsi_str = ''
    for s in imsi:
        if s.isalpha(): 
            imsi_str += hex(ord(s))[2:].zfill(2)
        else:
            imsi_str += hex(int(s))[2:].zfill(2)
    return  phone_num.zfill(16)+imsi_str

def mac_convert(mac):
    mac = mac.replace(":","")+'00' *2
    return mac +'00' * 8 * 7

def get_odd_even(data):
    sum = 0
    for index in range(14,len(data),2):
        sum += int(data[index:index+2],16)
    return hex(sum)[-2:].zfill(2)

def file_read(file):
    if os.path.exists(file) and os.path.getsize(file):
        f = open(file,"r")
        list_arr = []
        for line in f:
            if line.strip():
                list_arr.append(line)
        f.close()
        return  list_arr

def str_join(imsi_post_list):
    #long|lat|high|lac|ci|phone_num|imsi|mac
    l_str = []
    for msg_index in imsi_post_list:
        long = msg_index.strip().split("|")[0]
        # lg = round((float(long) + random.uniform(0.0001, 0.0010)), 6)
        # long_str = str(lg)
        lat = msg_index.strip().split("|")[1]
        # la = round((float(lat) + random.uniform(0.0001, 0.0010)), 6)
        # lat_str = str(la)
        h = msg_index.strip().split("|")[2]
        lac = msg_index.strip().split("|")[3]
        ci = msg_index.strip().split("|")[4]
        phone_num = msg_index.strip().split("|")[5]
        imsi = msg_index.strip().split("|")[6]
        macaddr = msg_index.strip().split("|")[7]

        date = get_date()
        long_lat_high = long_lat_convert(lat, long, high=h)
        lac_ci = cell_convert(lac,ci)
        device = device_convert(phone_num, imsi)
        mac = mac_convert(macaddr)


        suffix = msg_head + date + long_lat_high + status + gyro + lac_ci + \
            device + mac + other

        odd_even = get_odd_even(suffix)
        result = suffix + odd_even
        l_str.append(result)
    return  l_str

def dataSwitch(data):
    str1 = b''
    str2 = b''
    while data:
        str1 = data[0:2]
        s = int(str1,16)
        str2 += struct.pack('B',s)
        data = data[2:]
    return str2


def create_conn(ADDR,send_data):
    cli_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    reuse = True
    cli_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, reuse)
    # connect
    cli_socket.connect(ADDR)
    cli_socket.send(send_data)



if __name__ == "__main__":
    HOST = '192.168.2.223'
    PORT = 12212
    ADDR = (HOST,PORT)
    # long|lat|high|lac|ci|phone_num|imsi|mac
    msg_list = file_read("msg_chuandai.txt")
    concu = len(msg_list)
    data_list = str_join(msg_list)

    while True:
        print("msg send loop to start...")
        for data in data_list:
            send_data = dataSwitch(data)
            create_conn(ADDR,send_data)
            time.sleep(1)
        print("msg send loop finished...")
        time.sleep(5)


プロファイルの例:
102.610006|26.326207|699|33251|33569|8613502111060|460018032738617|00:00:00:00:00:00
102.601343|26.342289|699|33251|33569|8613502111060|460018032738617|00:00:00:00:00:00
102.638794|26.311119|700|33251|35872|8613502111061|460018032738617|00:00:00:00:00:00