2008-09-12 44 views
9

当我在socket对象上调用socket.getsockname()时,它返回我的机器内部IP和端口的元组。但是,我想检索我的外部IP。什么是最便宜,最有效的方式呢?如何在Python中获取套接字的外部IP?

+0

另一个伟大的网站,提供一个实惠的解决方案是得到[icanhazip.com] HTTP请求(http://icanhazip.com) – Droogans 2012-01-13 12:32:15

回答

8

如果没有外部服务器的配合,这是不可能的,因为您和其他计算机之间可能有任何数量的NAT。如果是自定义协议,您可以要求其他系统报告连接的地址。

5

我能想到的保证给你的唯一办法就是打一个像http://whatismyip.com/这样的服务来得到它。

+1

不明白为什么这是否决。这是恕我直言的唯一方法来获得任何系统的外部IP地址。仅仅因为路由器告诉你它认为你的IP地址是什么,或者它认为它的IP地址并不意味着没有另外的NAT。 – 2008-09-12 07:50:00

+0

@MatthewSchinckel:+1提到另一个NAT。另外,不同的外部服务可能会看到不同的外部IP,例如,我记得访问一个图书馆网站时,我必须使用不同的路由,以便该网站看到不同的(允许的)ip,即公共ip可能取决于目的地。 – jfs 2014-02-27 17:44:16

1

进口插座

S = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

s.connect(( “msn.com”,80))

s.getsockname( )

0

使用地址建议中的http://whatismyip.com

import urllib 
def get_my_ip_address(): 
    whatismyip = 'http://www.whatismyip.com/automation/n09230945.asp' 
    return urllib.urlopen(whatismyip).readlines()[0] 
+1

请注意,他们说这不是每300秒超过一次。 – Claudiu 2011-03-07 23:57:09

3

0源

''' 
Finds your external IP address 
''' 

import urllib 
import re 

def get_ip(): 
    group = re.compile(u'(?P<ip>\d+\.\d+\.\d+\.\d+)').search(urllib.URLopener().open('http://jsonip.com/').read()).groupdict() 
    return group['ip'] 

if __name__ == '__main__': 
    print get_ip() 
1
print (urllib.urlopen('http://automation.whatismyip.com/n09230945.asp').read())