python中的sendto()
我在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。
当我向目标服务器发送数据时,我使用snmp,OID是''ifInOctets'',来获取流量信息。
但是我重新计算流量到''Kbits''单位时,大约是128。
我该如何使用这个程序将带宽填满到1Gbits?(换句话说,我想把带宽用满)
谢谢你的帮助。
2 个回答
2
你的程序运行得不够快,无法在网络上达到1Gbps的速度。
为了让它运行得更快,你可以:
- 去掉在
sendto
之后调用print
的部分。(打印本身就比较慢。) - 提前处理你的
auth3.log
文件,这样就不需要在内部循环中处理它。(现在你在循环中使用.split
和.strip
,这两者都在浪费CPU时间。) - 重写你的程序,发送更大块的数据。
不过,我担心结果还是达不到1Gbps。要真正把你的网络带宽用到极限,可以试试使用像Colasoft Packet Builder这样的流量生成程序(虽然我也不确定这个程序是否能做到。1Gbps的流量可真不少。)
2
你这段代码已经实现了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,这样可能会让循环运行得更快。如果代码运行后还是没有产生足够的流量,你可能需要同时启动多个进程来处理。