Twisted > 如何从窗口TCP客户端读取超过TCP帧长度(例如1380字节)的TCP消息
我正在写一个扭曲的服务器,用来读取最多64KB的TCP消息。我发现我的数据接收器每1380字节被linereceiver类调用一次,结果发现这是Windows客户端的TCP帧大小。有没有办法绕过这个限制,而不需要逐个处理这些1380字节的块呢?
from twisted.internet.protocol import Protocol
from twisted.internet.protocol import Factory
from twisted.enterprise.adbapi import ConnectionPool
class CSVReceiver(Protocol):
def dataReceived(self, line):
print 'line RX :', len(line) , ' : ' , str(line)
数据接收器被调用时,每1380字节就会打印一次,比如当发送一个6KB的TCP消息到我们的服务器时,会打印4次。有没有什么方法可以避免这种情况,这样我们就能在一次回调中处理整个字符串呢?
谢谢。
STAN
2 个回答
1
TCP传输的是数据流,而不是单独的消息。在网络传输过程中,数据流可能会被拆分成任意小的部分。如果你能控制整个网络环境,你可以调整你的Windows客户端,让它有不同的窗口大小。但这时你可能还需要特别设置你的本地路由器,以支持巨型帧,因为即使是以太网默认也不支持超过1500字节的帧。
简单来说,对于大多数网络情况,答案都是“不能”。那么,为什么你需要关心这个呢?LineReceiver
的存在就是为了把完整的行传递给你,而不是让你去担心从TCP流中接收到的那些大小不一的数据块。
1
你在python_forum上问了这个问题,我已经在那里回答你了。你需要使用LineReceiver,并且想把MAX_LENGTH
设置成一个更大的数字。