Twisted中TCP协议的数据丢失问题
我用twisted.internet模块写了一个基于TCP的服务器,这个服务器可以同时处理很多连接。
我通常通过protocol.Protocol的实例来发送数据,但我遇到了一个问题。
有些TCP连接可能因为超时而关闭,而我似乎没有收到任何通知,这样我在关闭的连接上写的数据就可能会丢失。
而且,数据丢失的问题可能还会通过其他方式发生。
有没有什么好的方法来控制这个问题?(socket.send可以返回状态,但transport.write似乎没有返回值)
1 个回答
4
这个问题并不是Twisted特有的。如果你想知道数据是否被接收,你的协议必须有某种确认机制。
从send()
的结果来看,它并不能告诉你数据是否被对方确实接收了;它只是说明数据已经被放入了内核的传输队列。从你应用的角度来看,数据是由Twisted放入队列的,还是由你的C运行时、内核、下游的交换机,或者对方的内核放入的,这些其实都不重要。也许数据已经发送,也许没有。换句话说,transport.write()
会处理一些send()
不处理的额外缓冲,确保它总是能缓冲你所有的字节,而send()
可能只会缓冲一部分。
如果你在意网络对端是否看到了你的数据,你绝对需要有一个应用层的确认消息。