在 python 使用socket 获取 IP

[经验]Python获取本机IP(外网IP)的方法总结
今天碰到这个问题,用Python获得本地IP地址,首先想到用socket.gethostbyname,代码如下:
程序代码:
import socket
ip = socket.gethostbyname(socket.gethostname())
print ip

可惜这样并不完美,特别如果是ADSL拨号或者局域网上网会得到192.168.*.*这种内部IP。


好像Linux下面可以用:
程序代码:
import socket
import fcntl
import struct
def get_ip_address(ifname):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    return socket.inet_ntoa(fcntl.ioctl(
        s.fileno(),
        0x8915,   # SIOCGIFADDR
        struct.pack( ' 256s ', ifname[:15])
    )[20:24])
print get_ip_address( ' lo ')
print get_ip_address( ' eth0 ')
具体没试过,我主要写的是windows下面的应用,只能另寻他法。


找到一种windows和Linux下面通用的方法:
程序代码:
import re,urllib2
print re.search( ' \d+\.\d+\.\d+\.\d+ ',urllib2.urlopen( " http://www.whereismyip.com ").read()).group(0)
感觉有点山寨,访问专门显示自己IP的网站,然后采集它的内容,用正则分析提取出IP地址的字符串。
这样有个问题,如果访问的网站挂掉了,这程序就失灵了。


完美解决方案:
程序代码:
import re,urllib2
class Getmyip:
    def getip(self):
         try:
            myip = self.visit( " http://www.ip138.com/ip2city.asp ")
         except:
             try:
                myip = self.visit( " http://www.bliao.com/ip.phtml ")
             except:
                try:
                    myip = self.visit( " http://www.whereismyip.com/ ")
                except:
                    myip = " So sorry!!! "
         return myip
    def visit(self,url):
        opener = urllib2.urlopen(url)
         if url == opener.geturl():
            str = opener.read()
         return re.search( ' \d+\.\d+\.\d+\.\d+ ',str).group(0)
getmyip = Getmyip()
localip = getmyip.getip()
print localip
用try尝试第一个网站,如果挂掉了继续尝试第二个,如果第二个也挂掉了就尝试第三个,总不能三个网站同时挂掉

使用socket获取更多的信息
getsocketname:获得本机的信息(IP和port)
getpeername:获得远程机器的信息(IP和port)
fileno:每一个socket对应一个fd,使用此方法可以获得fd,为一个整数
import socket
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
port = socket.getservbyname("http","tcp")
s.connect(("www.google.com",port))
print "Connect from",s.getsockname()
print "Connect to",s.getpeername()
print "file descriptor",s.fileno()
s.close()

直接获取远程IP

import socket
socket.gethostbyname('google.com')


直接获取本地IP

import socket
socket.gethostbyname(socket.gethostname())
socket.gethostbyname_ex(socket.gethostname())

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值