Python socket.sendall发送任意长度

Python socket.sendall发送任意长度,python,sockets,client,Python,Sockets,Client,我正在创建一个小脚本,使用Python3套接字库将调用记录发送到服务器 每条记录的长度正好是109字节 当我在套接字发送器中循环,观察接收端和wireshark时,我发现有些数据包太大而不正确。Wireshark显示一个包含正确数据的数据包的长度为170。正在发送的某些数据包长度超过1500 有时,接收端将拒绝长度为59和50的2个数据包(总计1个完整数据包) 有没有办法让它更可靠地工作 这是我使用的方法 def connect_to_collector(iterator_obj, host,

我正在创建一个小脚本,使用Python3套接字库将调用记录发送到服务器

每条记录的长度正好是109字节

当我在套接字发送器中循环,观察接收端和wireshark时,我发现有些数据包太大而不正确。Wireshark显示一个包含正确数据的数据包的长度为170。正在发送的某些数据包长度超过1500

有时,接收端将拒绝长度为59和50的2个数据包(总计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()
def connect_to_收集器(迭代器对象、主机、端口、速率、计数):
如果计数=无:
count=len(迭代器\对象mylist)
延迟=3600/int(速率)
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s、 连接((主机,int(端口)))
打印('\n[+]连接到端口{}上的{}。格式(主机,端口))
开始=计时器()
i=0
对于迭代器_obj中的记录:
如果我不算:
尝试:
如果len(记录)不是长度:
打印('长度为',长度)
s、 sendall(记录)
时间。睡眠(延迟)
i+=1
除:
e=系统执行信息()
打印('发生发送错误',e)
打印('\n[+]在{:.4f}秒内将{}发送到{}端口上的{}。格式(i,主机,端口,计时器()-start))
sys.exit()
如果冗长:
打印('发送:{:''
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

有没有办法让它更可靠地工作

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


如果您想要数据报协议,请使用UDP。但在这种情况下,您必须自己处理丢失的数据包和数据包重新排序或重复。有类似SCTP的协议,它是一种类似UDP的数据报协议,但具有TCP的可靠性,但它们可能不在任何地方都得到普遍支持,并且您可能会在使用时遇到问题重写。

这很有意义。此外,为了子孙后代的利益,我只想指出,我的代码中存在一个错误,导致它发送重复的代码。将在更正后进行编辑。
for record in iterator_obj:

  if i < count:
    try:
      if len(record) is not length:
        print ('the length was ', length)
      s.sendall(record)