繁体   English   中英

Python TCP缓冲区溢出

[英]Python TCP buffer overflow

我与客户端服务器进行通信,我编写了以下服务器来处理传入的消息,但是如果该消息大于缓冲区,则它将丢失。 如果邮件大于缓冲区大小,如何接收整个包裹? 有没有可能,或者我必须强制客户端(以最大的缓冲区大小请求发送消息)以在缓冲区大小内发送消息?

msg ='' 
while( True ):                 
     msg += server.recv( 20480 )                                    
     aSplit = msg.partition( "</packet>" ) 
     #We received the full message
     while( aSplit[ 1 ] == "</packet>" ):                           
          messagehandler(  aSplit[ 0 ] + "</packet>" )                        
          msg = aSplit[ 2 ]
          aSplit = msg.partition( "</packet>" )

处理任何类型的打包消息格式时,实际上只有两种选择:

  1. 确保您的缓冲区足够大以处理整个消息。
  2. 编写代码,以便它可以解析部分消息。

但是,当我说“缓冲区”时,我并不是说recv()的参数-您可以将其设为任意大小,并多次遍历while循环,直到获得完整的消息为止。

因此,采用缓冲方法,您可以执行以下操作:

msg = ''
while True:
    msg += server.recv(8192)
    while True:
        aSplit = msg.partition("</packet>")
        if not aSplit[1]:
            break
        messagehandler(aSplit[0] + "</packet>")
        msg = aSplit[2]

之所以有效,是因为如果未找到</packet>那么partition()仍返回一个3元组,其中第一个项目是整个字符串,而其他两个为空。 因此,一直以来, partition()为分隔符返回一个非空字符串,然后找到了一个数据包。 一旦它为空,则msg会有一个部分数据包(或者它是空的),因此我们返回网络进行读取,直到再次获得整个数据包。

这确实涉及将整个消息缓冲在msg字符串中,但这很好,除非您期望这些消息变得非常大(数兆字节)-例如,如果消息包含大文件,则可能会发生这种情况。 在这种情况下,您需要变得更聪明,并执行一些操作,例如将数据交换到磁盘上或在接收到数据时对其进行处理。

让我知道是否不清楚。

编辑:我应该补充一点,确保缓冲区(即msg )不会变得太大通常是一个好主意-如果确实如此,则您需要关闭连接,因为出了问题。 这将阻止为应用程序提供无尽数据的东西,直到内存在系统上意外或恶意用完。 另外,您还需要确保字符串</packet>不会真正出现在消息中-这会错误地将消息分成两半。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM