python tcp put连接重置

时间:2013-11-26 00:55:01

标签: python tcp

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'

1 个答案:

答案 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))