[英]asyncio Transport does not close TCP connection
所以我对 asyncio 有点问题。 参考代码为:
总之:
def _reset_timeout(self, duration=None):
if self._timeout_handle is not None:
self._timeout_handle.cancel()
self._timeout_handle = self.loop.call_later(
duration or self._timeout_duration, self._timeout_cb
)
self._timeout_cb
是这样的:
def _timeout_cb(self):
log.info('%r connection timeout', self.session.peer)
self.transport.close()
self._reset_timeout(self._proxy_timeout)
测试是这样的:
class TestProxyProtocolV1Controller:
def test_timeout(self, plain_controller):
# The next line ensures that _proxy_timeout is set
assert plain_controller.smtpd._proxy_timeout > 0.0
prox_test = b"PROXY TCP4 255.255.255.255 255.255.255.255 65535 65535\r\n"
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
sock.connect(Global.SrvAddr)
# The next line simulates timeout
time.sleep(plain_controller.smtpd._proxy_timeout * 1.1)
with pytest.raises(ConnectionAbortedError):
sock.send(prox_test)
_ = sock.recv(4096)
此测试适用于 Windows,但在 Linux 中失败。 失败是这样的:
aiosmtpd/tests/test_proxyprotocol.py:632: in test_timeout
_ = sock.recv(4096)
E Failed: DID NOT RAISE <class 'ConnectionAbortedError'>
如果我在测试中删除pytest.raises
部分,它可以在 Linux 中工作......但这意味着超时不会结束连接,这是不正确的!
所以,本质上,我的想法是:
self.transport.close()
结束了 Windows 中的 TCP 连接,但不知何故使 TCP 连接在 ZEDC9F0A5A5D577497BF3168 中保持活动状态
如何使 TCP 连接在 Linux 上结束? 除了self.transport.close()
我还应该做什么?
我决定发布我实施的解决方法。
因此,我没有在服务器代码中进行处理,而是像这样编辑了测试用例:
class TestProxyProtocolV1Controller:
def test_timeout(self, plain_controller):
# The next line ensures that _proxy_timeout is set
assert plain_controller.smtpd._proxy_timeout > 0.0
prox_test = b"PROXY TCP4 255.255.255.255 255.255.255.255 65535 65535\r\n"
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
sock.connect(Global.SrvAddr)
# The next line simulates timeout
time.sleep(plain_controller.smtpd._proxy_timeout * 1.1)
with pytest.raises(ConnectionAbortedError):
sock.send(prox_test)
resp = sock.recv(4096)
if resp == b"":
raise ConnectionAbortedError
我对此完全不满意,因此我将不胜感激任何建议/更正。
但无论如何,发展至少可以暂时继续下去。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.