【问题标题】:How to detect the server closing a unix domain socket?如何检测服务器关闭 Unix 域套接字?
【发布时间】:2014-06-13 20:38:19
【问题描述】:

我在搞乱 python twisted 库,我似乎无法弄清楚如何让我的客户端检测到关闭其套接字的服务器。我的客户继续让我将数据发送到不存在的服务器。这是我的服务器:

test_server.py

​​>
from twisted.internet import protocol, reactor, endpoints, stdio
from twisted.protocols.basic import LineReceiver


class ConnectionProtocol(LineReceiver):
    from os import linesep as delimiter

    def lineReceived(self, line):
        print 'got line: %s' % line
        self.sendLine(line)


class ConnectionFactory(protocol.Factory):
    def buildProtocol(self, addr):
        return ConnectionProtocol()


def main():
    endpoint = endpoints.UNIXServerEndpoint(reactor, './test.sock',  5, 0777, False)
    endpoint.listen(ConnectionFactory())
    print 'starting the reactor'
    reactor.run()


main()

它所做的只是将它收到的每一行发送回连接的客户端。 这是客户端:

test_client.py

​​>
import os
from twisted.internet import protocol, reactor, endpoints, stdio
from twisted.protocols.basic import LineReceiver


class CommandProtocol(protocol.Protocol):
    def dataReceived(self, data):
        print data,


class StdinProtocol(LineReceiver):
    from os import linesep as delimiter

    def __init__(self, client):
        self._client = client

    def connectionMade(self):
        self.transport.write('>>> ')

    def lineReceived(self, line):
        print 'writing line: %s' % line
        self._client.transport.write(line + os.linesep)


def printError(failure):
    print str(failure)


def main():
    point = endpoints.UNIXClientEndpoint(reactor, './test.sock')
    proto = CommandProtocol()
    d = endpoints.connectProtocol(point, proto)
    d.addErrback(printError)

    stdio.StandardIO(StdinProtocol(proto))
    reactor.run()


main()

如果我运行服务器,然后运行客户端,然后终止服务器,客户端仍然会写入CommandProtocol 的传输,就像什么都没发生一样。我认为errback 函数至少会报告一些东西。在客户端先于服务器运行的情况下,errback 函数调用时会出现 ConnectError,但我特别想检测客户端已经连接到服务器,而服务器退出的情况。

如何检测到服务器已关闭?

【问题讨论】:

    标签: python sockets twisted unix-socket


    【解决方案1】:

    ITransport.write 如果在已断开连接的传输上调用,则为静默无操作。

    如果您想知道连接丢失,请覆盖connectionLost 方法。一旦您知道连接已丢失,您就可以安排您的程序停止接受输入或对接收到的输入执行其他操作。

    【讨论】:

      【解决方案2】:

      我猜 os.stat 方法和 stat 模块可以帮助你。您可以将您的客户代码更改为如下所示:

      import os
      import stat
      from twisted.internet import protocol, reactor, endpoints, stdio
      from twisted.protocols.basic import LineReceiver
      
      
      class CommandProtocol(protocol.Protocol):
          def dataReceived(self, data):
              print data,
      
      
      class StdinProtocol(LineReceiver):
          from os import linesep as delimiter
      
          def __init__(self, client):
              self._client = client
      
          def connectionMade(self):
              self.transport.write('>>> ')
      
          def lineReceived(self, line):
              print 'writing line: %s' % line
              self._client.transport.write(line + os.linesep)
      
      
      def printError(failure):
          print str(failure)
      
      
      def main():
          if os.stat('./test.sock').st_mode & (stat.S_IRGRP | stat.S_IRUSR | stat.S_IROTH):
              print "1"
              print "using control socket"
              point = endpoints.UNIXClientEndpoint(reactor, './test.sock')
      
              proto = CommandProtocol()
              d = endpoints.connectProtocol(point, proto)
              d.addErrback(printError)
      
              stdio.StandardIO(StdinProtocol(proto))
              reactor.run()
          else:
              print "not ready"
      
      
      main()
      

      【讨论】:

      • 这将处理客户端在服务器之前启动的情况,但在客户端已经连接后服务器关闭的情况下没有帮助。我已经编辑了我的问题以澄清这一点。
      猜你喜欢
      • 1970-01-01
      • 2021-10-13
      • 1970-01-01
      • 2015-06-18
      • 1970-01-01
      • 1970-01-01
      • 2017-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多