def put_data(line = '', dest_host = 'server', dest_port = '876'):
''' This method once invoked pushes data to dest_host and dest_port '''
if line:
cmd = '/bin/echo put ' + line + '| ' + '/bin/nc -w 15 server port'
print('TCP put using command: ' + cmd)
os.system(cmd)
我使用上面的方法将TCP数据行放在HBASE顶部的opentsdb驱动程序中。
可以看出,这种方法为每个被推出的数据行调用netcat实用程序。
问题: 1.)是否有更好的方法来完成此任务,因为每次我想要推送的每一行数据都不必打开TCP连接?我每分钟运行一次,这导致TIME_WAIT状态下的大量连接。
2.。)我可以使用持久TCP套接字一次推送1000行吗?我已经查看了python中的netcat实现,但是当我推送所有行时,它们似乎会导致从对等端重置连接
例如: 当我尝试使用以下方法时,我不断收到错误:错误(104,'通过对等方重置连接')
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(server, port)
for line in data_list:
s.sendall(line)
s.close()
error(104, 'Connection reset by peer')
正在推送的数据样本行:
line1 = 'fin.wait2 1385428269 0.0 host=srv1 testname=tcp source=nag03 product=rebuild'
line2 = 'established 1385428269 11.0 host=srv2 testname=tcp source=nag03 product=rebuild'
line3 = 'fin.wait1 1385428269 0.0 host=srv3 testname=tcp source=nag03 product=rebuild'
line4 = 'last.ack 1385428269 0.0 host=srv4 testname=tcp source=nag03 product=rebuild'
line5 = 'unknown 1385428269 0.0 host=srv5 testname=tcp source=nag03 product=rebuild'
line6 = 'syn.recv 1385428269 0.0 host=srv6 testname=tcp source=nag03 product=rebuild'
答案 0 :(得分:1)
问题是你的行最后没有换行符。
您的基于netcat的代码正在使用echo
将行传递给netcat,在没有任何参数的情况下,会在末尾添加换行符,因此它可以正常工作。
但是基于Python socket
的代码没有添加任何换行符。
所以,你想发送五个这样的命令:
put fin.wait2 1385428269 0.0 host=srv1 testname=tcp source=nag03 product=rebuild
put established 1385428269 11.0 host=srv2 testname=tcp source=nag03 product=rebuild
put fin.wait1 1385428269 0.0 host=srv3 testname=tcp source=nag03 product=rebuild
put last.ack 1385428269 0.0 host=srv4 testname=tcp source=nag03 product=rebuild
put unknown 1385428269 0.0 host=srv5 testname=tcp source=nag03 product=rebuild
put syn.recv 1385428269 0.0 host=srv6 testname=tcp source=nag03 product=rebuild
...相反,你发送一个这样的大行:
put fin.wait2 1385428269 0.0 host=srv1 testname=tcp source=nag03 product=rebuildput established 1385428269 11.0 host=srv2 testname=tcp source=nag03 product=rebuildput fin.wait1 1385428269 0.0 host=srv3 testname=tcp source=nag03 product=rebuildput last.ack 1385428269 0.0 host=srv4 testname=tcp source=nag03 product=rebuildput unknown 1385428269 0.0 host=srv5 testname=tcp source=nag03 product=rebuildput syn.recv 1385428269 0.0 host=srv6 testname=tcp source=nag03 product=rebuild
要么是因为你的数据而感到困惑并挂断了,要么拒绝你的过长线作为DoS尝试,要么只是等待新线应该结束线并且永远不会得到它并最终超时。
无论底层问题是什么,根本原因都是缺少换行符,修复方法是将它们放在那里。
当我们处于此状态时,您的netcat代码会在每个命令的开头添加put
,并且您的socket
代码不会,并且您可能还需要修复它。所以:
for line in data_list:
s.sendall('put {}\n'.format(line))