Python socket.sendall显然发送任意长度

时间:2014-11-03 22:36:42

标签: python sockets client

我正在创建一个小脚本,使用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()被多次调用同一条记录。

我删除了那个循环。

1 个答案:

答案 0 :(得分:0)

  

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

     

有没有办法让它更可靠地运作?

您在这里使用TCP,TCP是流协议,而不是数据报(数据包)协议。这意味着整个连接被视为单个数据流和TCP堆栈,如果可以自由优化以优化传输,例如将一些数据一起发送或分割其他一些数据。如果你期望每个recv匹配恰好一个发送你做错了。

如果您想要数据报协议使用UDP。但在这种情况下,您必须自己处理丢失的数据包和数据包重新排序或重复。有像SCTP这样的协议,它们是UDP之类的数据报协议,但具有TCP的可靠性,但它们可能无法在任何地方得到普遍支持,您可能会遇到通过防火墙使用它的问题。