python获取本机IP

问题

写接口服务中需要知道本机服务器的ip, 之前有写一版,在生产机上是能够正常得到ip的,到测试环境的时候就出问题了,得到的结果是127.0.0.1

初始获得ip地址代码为:

import socket

def get_host_ip():
    hostname = socket.gethostname()
    ip = socket.gethostbyname(hostname)
    return ip

本机IP与127.0.0.1及localhost的区别

127.0.0.1
  • 环回地址是主机用于向自身发送通信的一个特殊地址。同一台主机上的两项服务若使用环回地址而非分配的主机地址,就可以绕开TCP/IP协议栈的下层。

  • IPv4的环回地址为:127.0.0.0到127.255.255.255都是环回地址

  • 当操作系统初始化本机的TCP/IP协议栈时,设置协议栈本身的IP地址为127.0.0.1(保留地址),并注入路由表

127.0.0.1是保留地址之一,来检验本机TCP/IP协议栈,ping 127.0.0.1一般作为测试本机TCP/IP协议栈正常与否的判断之一。

localhost

localhost首先是一个域名,也是本机地址,它可以被配置为任意的IP地址。不过通常情况下都指向:(如下)

  • IPv4:表示 127.0.0.1

  • IPv6:表示 [::1]

本机IP

本机IP,可以理解为本机有三块网卡:

  • 一块网卡叫做loopback(虚拟网卡)
  • 一块叫做ethernet(有线网卡)
  • 一块叫做wlan(你的无线网卡)

联网,网卡传输,受防火墙和网卡限制

解决方法

获取本机IP有其它的方法:

import os
import socket

gw = os.popen("ip -4 route show default").read().split()
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect((gw[2], 0))
ipaddr = s.getsockname()[0]
gateway = gw[2]
host = socket.gethostname()

print("IP:", ipaddr, " GW:", gateway, " Host:", host)

或者

import os
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("8.8.8.8", 80))
ip = s.getsockname()[0]

print("IP:", ip) 

参考

  • https://forums.raspberrypi.com/viewtopic.php?t=188615#p1187999
  • https://blog.csdn.net/msdnwolaile/article/details/51278867
  • https://stackoverflow.com/questions/55296584/getting-127-0-1-1-instead-of-192-168-1-ip-ubuntu-python

更多精彩内容可以关注:AI科技时讯

你可能感兴趣的:(Python,服务器,IP,python)