【发布时间】:2016-08-24 11:51:42
【问题描述】:
我在使用 Python3/asyncio(Protocol) 编写的服务器应用程序时遇到了问题,但我很确定它与 python 或 asyncio 相关的并不多,因为我已经尝试了不同的版本,也有一些 5liner 仅使用套接字接口。 它是关于与许多客户端硬件 TCP/IPRS232 转换器的并发通信。这就是使用 asyncio 而不是阻塞写入的线程的原因。
有一些周期性的短数据发送。当我物理切断连接并等待异常发生时会出现问题:
asyncio - Fatal read error on socket transport protocol
<_SelectorSocketTransport fd=11 read=polling write=<idle, bufsize=0>>
Traceback (most recent call last):
File "/usr/lib/python3.5/asyncio/selector_events.py", line 663, in
_read_ready
data = self._sock.recv(self.max_size)
OSError: [Errno 113] No route to host
发生了,但是在 15 分钟 之后,这意味着我在 15 分钟内发出信号,一切都很好,但事实并非如此,这太长了并且功能中断。 在 Ubuntu 16.04、Ubuntu 14.04 和 Debian Jessie 中检查的行为,都在不同的硬件上。
我发现(可能)内核正在缓冲数据,因为如果我在十分钟后重新连接设备,所有数据都会立即刷新。我知道这对短时间断开有好处,我对 10 秒、15 秒甚至一分钟都没有问题,但 15 分钟太多了。
通过实现应用程序协议回答了类似的问题,这在我的情况下是不可能的。
我只是想确保对方在合理的时间内收到数据包(TCP ack)。
我仔细阅读了有关socket.setsockopt 的文档,但没有发现任何有用的东西。也没有找到方法如何检查发送缓冲区是否被刷新以做一些解决方法 - 手动检测损坏的路由。
TCP keep-alive 也无济于事,因为它基于非活动时间,发送数据即为活动。
【问题讨论】:
标签: python sockets tcp send disconnect