我用twisted.internet模块编写了一个基于tcp的服务器。这是一个高并发环境。
我通常通过protocol.Protocol实例发送数据,我遇到了问题。 某些tcp连接可能因超时而关闭,似乎我无法收到任何通知,因此我在封闭连接中写入的数据可能会丢失。
数据丢失问题可能是由其他方式引起的。
有没有什么好方法可以控制它? (socket.send可能返回一个状态,transport.write似乎没有返回)
答案 0 :(得分:4)
此问题并非特定于Twisted。如果您想知道收到数据,您的协议必须确认收到了数据。
来自send()
的结果不告诉您数据是由对等方授权收到的;它只是说它被内核排队等待传输。从您的应用程序的角度来看,数据是由Twisted,C运行时,内核,中间下游交换机,还是对等内核或其他任何内容排队都无关紧要。也许它被发送了,也许它不是。换句话说,transport.write()
负责send()
没有的额外缓冲,保证它总是缓冲所有字节,而send()
只缓冲一些。
如果您关心网络对等方是否看过您的数据,您绝对需要有应用程序级确认消息。