gpt4 book ai didi

python - twisted - 获取操作系统选择的监听端口

转载 作者:太空狗 更新时间:2023-10-29 19:35:33 27 4
gpt4 key购买 nike

我正在使用应用程序框架编写一个扭曲的 P2P 客户端。传入连接的监听端口将位于随机(操作系统确定的)端口上。但是,我需要一种方法来确定该端口在创建后是什么:

import twisted... etc.

application = service.Application('vmesh')
peerservice = MyPeerService()
servicecollection = service.IServiceCollection(application)
factory = MyPeerFactory(peerservice)
server = internet.TCPServer(0, factory) # listen on random port
listen_port = server.getHost().port # ??? doesn't work...
server.setServiceParent(servicecollection)

我在文档中找不到任何有关查询由 internet.TCPServer() 或由 reactor.listenTCP() 转发到的端口创建的内容。我不能简单地等待连接发生,因为客户端必须宣布其端 Eloquent 能发生这些连接。

最佳答案

listenTCP 返回 IListeningPort ,它有一个 getHost() 方法,该方法返回一个带有 port 的对象。例如:

>>> from twisted.internet import reactor
>>> from twisted.internet.protocol import Factory
>>> port = reactor.listenTCP(0, Factory())
>>> port.getHost().port
55791

然而,TCPServer在使用 privilegedStartService 启动之前不会调用 listenTCP .此外,IListeningPort 实际上并未通过公共(public) API 公开。所以,你需要自己写 Service .幸运的是,这很容易做到; TCPServer 做的不多。您只需要编写一个在它开始监听后立即在某处报告其端口的文件。这是一个例子:

from twisted.internet import reactor
from twisted.application.service import Service

class PortReporter(Service, object):
def __init__(self, factory, reportPort):
self.factory = factory
self.reportPort = reportPort

def privilegedStartService(self):
self.listeningPort = reactor.listenTCP(0, self.factory)
self.reportPort(self.listeningPort.getHost().port)
return super(PortReporter, self).privilegedStartService()

def stopService(self):
self.listeningPort.stopListening()
return super(PortReporter, self).stopService()

然后您可以在 tac 文件中使用它,如下所示:

from twisted.internet.protocol import Factory
from twisted.application.service import Application
application = Application("test")
def showPortNumber(n):
print("The port number is: %d" % (n,))
PortReporter(Factory(), showPortNumber).setServiceParent(application)

关于python - twisted - 获取操作系统选择的监听端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7069948/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com