代码之家  ›  专栏  ›  技术社区  ›  waynner

sendto()python

  •  1
  • waynner  · 技术社区  · 11 年前

    我使用python程序在Linux Ubuntu中做流量生成器,代码如下:

    import socket, sys
    
    host = sys.argv[1] #Server IP Address
    textport = sys.argv[2] #Server Binding Port
    
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #socket
    
    try:
    
        port = int(textport)
    
    except ValueError:
    
        port = socket.getservbyname(textport, 'udp')
    
    while 1:
    
       try:
            data = open('auth3.log')#read file
    
            for each_line in data: #each rows
                    try:
                            (role,line_spoken) = each_line.split(': ',1)#split two parts
                            role  =  role.strip()
                            s.sendto(role, (host, port))
                            print('Send: ' + str(role) + "\n" )
                    except:
                            pass
    
        except IOError as err:
            print('file isn\'t exist!!~'+str(err))
    
        finally:
            if 'data' in locals():   #If data have no object, Don't use data to close!!~
                    data.close()
    
        print "\n"
    

    auth3.log的大小约为1.8M。

    当我将数据发送到目标服务器时,我使用snmp来获取流量信息,该snmp的OID是“fInOpects”。

    但我的流量重新计算到“千比特”的单位大约是128。

    我如何使用这个程序来填充高达1Gbits的带宽?(换句话说,我想填满带宽)

    谢谢你的帮助。

    2 回复  |  直到 11 年前
        1
  •  2
  •   user4815162342    11 年前

    此版本的代码实现了Chris Merck建议的前两个优化。

    import socket, sys, itertools
    
    host = sys.argv[1] #Server IP Address
    textport = sys.argv[2] #Server Binding Port
    
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    
    try:
        port = int(textport)
    except ValueError:
        port = socket.getservbyname(textport, 'udp')
    
    # preprocess file data    
    with open('auth3.log') as data:
        roles = [role for (role, line_spoken) in line.split(': ', 1) for line in data]
    
    # preprocess everything we can
    hp = (host, port)
    send = s.sendto
    
    for role in itertools.cycle(roles):
        try:
            send(role, hp)
        except:
            pass
    

    为了进一步优化,您可能需要使用 Cython ,这可能会进一步加快循环速度。如果代码仍然不能生成足够的流量,那么您可能需要并行启动几个进程。

        2
  •  2
  •   Chris Merck    11 年前

    您的程序运行速度不够快,无法在线路上生成1Gbps。

    为了让它跑得更快,您可以:

    1. 删除对的呼叫 print 之后 sendto 。(打印速度很慢。)
    2. 预处理您的 auth3.log 文件,这样您就不需要在内部循环中处理它了。(现在你正在循环 .split .strip ,这两者都在浪费CPU时间。
    3. 重写程序以发送更大的数据块。

    但是,我担心结果会 无法达到1Gbps。要真正最大限度地提高您的线路,请尝试使用流量生成程序,例如 Colasoft Packet Builder (尽管我甚至不确定 那个 程序会做到的。1Gbps是 大量 流量。)