问题
写接口服务中需要知道本机服务器的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科技时讯