0

クライアントがバインドされているポートのファイル記述子を取得するにはどうすればよいですか。これで、異なるプロセス間でポートを共有したいと思います。

tcpサーバーのファイル記述子を取得できますが、クライアントのファイル記述子を取得できません。例えば:

p=reactor.listenTCP(8005,Myfactory())

ポートオブジェクトはどこにpありますか。ここでは、を使用するだけでファイル記述子を取得できます。p.fileno()

しかし、クライアントの場合

p=reactor.connectTCP('127.0.0','8080',MyFactory())

ここでやるならp.fileno()

次のようなエラーが発生します

AttributeError: 'int' object has no attribute 'fileno'

私はそれが整数であることを知っていますが、私の質問は次のとおりです。クライアントのファイル記述子を取得する他の方法はありますか?

4

1 に答える 1

1

ええと...あなたがやりたいのは少しハッキーです。

そもそも、この時点ではまだ接続が確立されていないため、connectTCP()の結果は役に立ちません。

接続が確立された後でファイル記述子を抽出することを考え始めることができるので、プロトコルインスタンスのconnectionMade()メソッドが呼び出されました。ファイル記述子に関する情報は、ITransportインターフェースを実装するトランスポートによって保持されます。残念ながら、このインターフェイスは、より一般的なファイル記述子に関する情報を公開しません。

単純なTCP接続の場合、トランスポートは、ファイル属性を持つtwisted.internet.protocol.FileWrapperのインスタンスになります。これらすべてを合計すると、コードは次のようになります。

class MyProtocol(protocol.Protocol):

    def connectionMade(self):
         print 'file descriptor is: ', self.transport.file.fileno()
于 2012-12-17T12:19:59.427 に答える