[英]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>" )
处理任何类型的打包消息格式时,实际上只有两种选择:
但是,当我说“缓冲区”时,我并不是说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.