首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sendto() python

sendto() python
EN

Stack Overflow用户
提问于 2013-03-09 22:12:49
回答 2查看 810关注 0票数 1

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

代码语言:javascript
复制
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来获取交通信息。

但是i重新计算到''Kbits'‘单位的流量大约是128。

我怎样才能用这个程序填满1Gbits的带宽?(换句话说,我想填带宽)

谢谢你的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-09 22:57:07

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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2013-03-09 22:26:08

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

要让它运行得更快,您可以:

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

但是,我担心结果仍然不会达到1Gbps。为了最大限度地发挥您的线路,尝试使用流量生成程序,如Colasoft Packet Builder (尽管我不确定该程序是否能做到这一点)。1Gbps是很大的流量。)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15311634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档