【问题标题】:How to use TCP Keepalive with Endpoints in Twisted?如何在 Twisted 中使用 TCP Keepalive 和端点?
【发布时间】:2014-01-14 13:40:51
【问题描述】:

Twisted 确实支持TCP Keepalive。但我找不到在端点(客户端和服务器)上设置它们的简单方法。

目前最好的做法是什么?

【问题讨论】:

    标签: python tcp twisted


    【解决方案1】:

    我看不出有一种方法可以通过 API 从端点干净地实现这一点。但是,请查看twisted.internet.endpoints._WrappingProtocol 的源代码 - 您可以将端点设置为使用_WrappingFactory*,它会在建立连接时回调延迟。此时在协议上设置了传输,您可以调用setTcpKeepAlive

    鉴于类名中的下划线,我会说这些是在内部使用的,我不会依赖它们的接口在版本之间保持一致。您应该将它们用作指南。

    或者,只需在您的协议的connectionMade 中调用self.transport.setTcpKeepAlive 并处理不支持此功能的情况(即该协议用于其他传输的情况)。

    #!/usr/bin/python
    # based on example at http://twistedmatrix.com/pipermail/twisted-python/2008-June/017836.html
    from twisted.internet import protocol 
    from twisted.internet import reactor
    
    class EchoProtocol(protocol.Protocol):
        def connectionMade(self):
            print "Client Connected Detected!"
            ### enable keepalive if supported
            try:
                self.transport.setTcpKeepAlive(1)
            except AttributeError: pass
    
        def connectionLost(self, reason):
            print "Client Connection Lost!"
    
        def dataReceived(self, data):
            self.transport.write(data)
    
    
    factory = protocol.Factory()
    factory.protocol = EchoProtocol 
    reactor.listenTCP(8000, factory) 
    reactor.run()
    

    对于这个简单的示例,我认为这提供了一个相当干净的解决方案,但是可能存在需要额外包装器代码的情况。

    * 请注意,_WrappingFactoryClientFactory 的子类,可能不适用于服务器。

    【讨论】:

    • 我特别要求提供端点。我想要一个适用于任何协议工厂的通用解决方案。
    • 并非端点下的每个传输都具有 TCP 特定功能,例如“保持活动”或“无延迟”......例如Unix 域套接字、串行连接和管道没有这些。
    • @oberstet:这就是我想在端点上执行此操作的原因。 TCP 端点肯定有 tcp keepalive。在协议上执行此操作(如答案中建议的那样)完全出于您的原因感觉错误:有人可能希望通过 rs232 运行 EchoProtocol。
    • 在串行运行的端点上设置“保持活动状态”会产生什么影响?这没有意义..
    • @Elrond,我已经对此进行了更多研究,但我看不出有一种方法可以通过 API 从端点干净地实现这一点。但是,请查看twisted.internet.endpoints._WrappingProtocol 的来源 - 您可以将端点设置为使用_WrappingFactory,它在建立连接时回调延迟。此时在协议上设置了传输,您可以调用setTcpKeepAlive。否则,只需将 setTcpKeepAlive 包装在 try except 块中...
    猜你喜欢
    • 2012-05-04
    • 1970-01-01
    • 2014-12-31
    • 2011-07-12
    • 2022-11-13
    • 2013-08-09
    • 1970-01-01
    • 2021-11-17
    • 2012-08-28
    相关资源
    最近更新 更多