Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 获取Twisted服务器';IP地址_Python_Twisted - Fatal编程技术网

Python 获取Twisted服务器';IP地址

Python 获取Twisted服务器';IP地址,python,twisted,Python,Twisted,如果我有一个Twisted服务器,如何找到它面向公众的IP地址 以这个简单的echo服务器为例: 来自twisted.internet导入协议、反应器、端点 类Echo(protocol.protocol): 接收到def数据(自身、数据): self.transport.write(数据) 类EchoFactory(协议工厂): def构建协议(自身、地址): 返回回声() server_endpoint=endpoints.serverFromString(reactor,“tcp:1234

如果我有一个Twisted服务器,如何找到它面向公众的IP地址

以这个简单的echo服务器为例:

来自twisted.internet导入协议、反应器、端点
类Echo(protocol.protocol):
接收到def数据(自身、数据):
self.transport.write(数据)
类EchoFactory(协议工厂):
def构建协议(自身、地址):
返回回声()
server_endpoint=endpoints.serverFromString(reactor,“tcp:1234”)
侦听\u端口\u延迟=服务器\u端点。侦听(EchoFactory())
反应堆运行()
我期待类似于
server\u endpoint.getHost()
的东西,但我看不出它提供了任何有用的东西

通过在reactor.run()前面添加以下行,我们可以看到服务器正在侦听所有接口(0.0.0.0):

def打印主机(侦听端口):
打印(“侦听端口.getHost():”,侦听端口.getHost())
侦听端口延迟。addCallback(打印主机)
它输出
侦听\u port.getHost():IPv4Address(type='TCP',host='0.0.0',port=1234)
。但是,这对服务器网络接口的IP地址没有帮助

我们可以通过添加以下内容作为
buildProtocol()的第一行来获取客户端的IP地址:

print(“客户地址:”,地址主机)
但这只给了我们客户的地址


如何获取服务器的IP地址?

Twisted将告诉您使用侦听端口上找到的方法将服务器绑定到的地址。不幸的是,您发现它有一个很大的局限性,即当服务器侦听所有本地地址(
INADDR\u ANY
)时,它会为您提供
0.0.0
INADDR\u ANY
)的标准IPv4四元表示形式)

当这种情况发生时,你必须走出扭曲。我发现这个包裹很适合这个。从文档中:

netifaces.interfaces() ['lo0','gif0','stf0','en0','en1','fw0'] >>>>>>addrs=netifacces.ifAddresss('lo0') >>>地址[netifaces.AF_INET] [{'peer':'127.0.0.1','netmask':'255.0.0.0','addr':'127.0.0.1']
通过将这些信息与
0.0.0.0
表示“所有本地地址”的观察结果相结合,您可以计算出服务器将在哪些本地地址上接受连接。

感谢臭名昭著的评论,我意识到服务器的IP地址只有在客户端连接后才可用。然而,正如Jean-Paul指出的,这个IP地址不一定是面向公众的,很可能是在本地路由器后面

要获取给定连接的服务器IP地址,我们可以使用类的
transport
属性中的
getHost()
方法。这将记录在界面中

例如,如果我们在原始问题的
Echo
协议类中添加以下方法,则每次客户端连接时,服务器都会打印出所使用的IP地址

def connectionMade(self):
打印(“主机给定连接的IP地址:”,self.transport.getHost())
因此,例如,如果您从运行服务器的同一台机器进行连接,您将看到:

主机给定连接的IP地址:IPv4Address(type='TCP',host='127.0.0.1',port=1234)

但是,如果从同一网络上的另一台计算机连接,您可能会看到:


主机给定连接的IP地址:IPv4Address(type='TCP',host='192.168.5.103',port=1234)

提出了类似的问题,但是自我回答实际上并没有回答他们自己的问题,而是使用
套接字
。如果服务器正在侦听
0.0.0.0
,则表示它正在侦听所有接口,服务器IP可能是其中的任何一个。您可以从客户端获取IP,因为它连接到特定的IP。您所说的“面向公众的IP地址”是什么意思?考虑服务器正在运行的主机可能在某种类型的NATIN路由器后面(是的,甚至服务器也不会考虑AWS EC2VPCS,使用它通常被认为是最佳实践)。@ Jean PaulCalderone,你的例子是钱。这正是我想要的主机,我甚至没有想到它们会在NATIN路由器后面。然而,我认为至少有可能获得服务器的内部IP地址(如果不是面向公众的,则是面向本机路由器的)。这在扭曲下是可能的吗?@au名昭著的。不,你是对的。一旦客户端建立了连接,它们就连接到了服务器上的特定网络接口。你如何在Twisted下访问该IP地址?这非常有用,谢谢。有趣的是,这不是一个从内部Twisted提供的功能。所有的编辑@10Rep有什么用?你对这个答案的更改是不正确的:“使用”确实是让·保罗想说的。@MatthewWalker对不起,让我再重复一遍。完成了。