簡體   English   中英

如何檢測關閉unix域套接字的服務器?

[英]How to detect the server closing a unix domain socket?

我正在使用 python 扭曲庫,我似乎無法弄清楚如何讓我的客戶端檢測到服務器關閉其套接字。 我的客戶端繼續讓我將數據發送到不存在的服務器。 這是我的服務器:

測試服務器.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()

它所做的就是將它得到的每一行發送回連接的客戶端。 這是客戶端:

測試客戶端.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函數至少會報告一些東西。 在客戶端在服務器之前運行的情況下,使用 ConnectError 調用errback函數,但我特別希望檢測客戶端已經連接到服務器並且服務器退出的情況。

如何檢測服務器已關閉?

如果在已斷開連接的傳輸上調用ITransport.write是一個靜默的空操作。

如果您想了解連接丟失,請覆蓋connectionLost方法。 一旦您知道連接已丟失,您就可以安排您的程序停止接受輸入或對它接收到的輸入執行其他操作。

我猜 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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM