我正在创建一个小脚本,使用Python 3套接字库将呼叫记录发送到服务器。
每条记录的长度都是109字节。
当我遍历套接字发送方,并观察接收端以及wireshark时,我发现有些数据包太大而不正确。 Wireshark显示具有正确数据的数据包长度为170。有些数据包的发送长度超过1500个。
有时,接收端将拒绝2个长度为59和50的数据包(最多加1个数据包)。
有没有办法让它更可靠地运作?
这是我使用的方法。
def connect_to_collector(iterator_obj, host, port, rate, count):
if count == None:
count = len(iterator_obj.mylist)
delay = 3600 / int(rate)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, int(port)))
print ('\n[+] Connected to {} on port {}'.format(host, port))
start = timer()
i = 0
for record in iterator_obj:
if i < count:
try:
if len(record) is not length:
print ('the length was ', length)
s.sendall(record)
time.sleep(delay)
i += 1
except:
e = sys.exc_info()
print ('SEND ERROR OCCURRED ', e)
print ('\n[+] Sent {} to {} on port {} in {:.4f} seconds'.format(i, host, port, timer() - start))
sys.exit()
if verbose:
print ('Sending : |{:' '<150}| record number |{}|'.format(record, i))
if i >= count:
break
# Clean up
print ('\n[+] Sent {} to {} on port {} in {:.4f} seconds'.format(count, host, port, timer() - start))
s.close()
编辑:
中有一个错误for record in iterator_obj:
if i < count:
try:
if len(record) is not length:
print ('the length was ', length)
s.sendall(record)
迭代器内部的while偶尔会导致sendall()被多次调用同一条记录。
我删除了那个循环。
答案 0 :(得分:0)
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
有没有办法让它更可靠地运作?
您在这里使用TCP,TCP是流协议,而不是数据报(数据包)协议。这意味着整个连接被视为单个数据流和TCP堆栈,如果可以自由优化以优化传输,例如将一些数据一起发送或分割其他一些数据。如果你期望每个recv匹配恰好一个发送你做错了。
如果您想要数据报协议使用UDP。但在这种情况下,您必须自己处理丢失的数据包和数据包重新排序或重复。有像SCTP这样的协议,它们是UDP之类的数据报协议,但具有TCP的可靠性,但它们可能无法在任何地方得到普遍支持,您可能会遇到通过防火墙使用它的问题。