繁体   English   中英

异步传输未关闭 TCP 连接

[英]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()

_reset_timeout在这部分被调用,像这样:

            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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM