【问题标题】:sendto() python发送到()蟒蛇
【发布时间】:2013-03-09 14:12:48
【问题描述】:

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

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。

当我向目标服务器发送数据时,我使用 OID 为 ''ifInOctets'' 的 snmp 来获取流量信息。

但我重新计算以“Kbits”为单位的流量约为 128。

如何使用这个程序将带宽填充到1Gbits?(也就是说,我要填充带宽)

感谢您的帮助。

【问题讨论】:

    标签: python snmp bandwidth traffic sendto


    【解决方案1】:

    此版本的代码实现了 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 对其进行处理,这可能会进一步加快循环速度。如果代码仍然没有产生足够的流量,您可能需要并行启动多个进程。

    【讨论】:

    • 非常感谢,''并行启动多个进程''的方法是我需要在这个程序中进行多线程处理的方式吗?
    • @WayneHong 我的意思是您可以启动整个程序的多个实例。您是否测量过此版本的带宽使用情况?
    • 所以我需要使用面向对象的编程来创建多个实例,即类中的对象? Netperf 测试的带宽约为 600Mbits。
    • 再次感谢。您的回答很有帮助,但我是 stackoverflow 的新手,很抱歉我没有足够的声誉来投票您的回答。
    【解决方案2】:

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

    为了让它运行得更快,你可以:

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

    但是,我担心结果会仍然达不到 1Gbps。要真正最大化您的线路,请尝试使用流量生成程序,例如 Colasoft Packet Builder(虽然我不确定即使 那个 程序也能做到。1Gbps 是一个 很多流量。)

    【讨论】:

    • 感谢您的再次回复,我修改了代码并尝试使用您提到的流量生成程序(Colaso​​ft Packet Builder)。但我认为它不能指定发送数据包的目标IP地址?如果是,那么它也许就是我需要的工具。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    • 2010-10-21
    • 2016-05-28
    • 2014-08-01
    • 2021-06-28
    • 1970-01-01
    相关资源
    最近更新 更多