了解最新公司動態(tài)及行業(yè)資訊
這種方法是最優(yōu)雅的獲取本地服務(wù)器IP的方式。沒有依賴關(guān)系服務(wù)器運維,也不用猜測機器上的網(wǎng)絡(luò)設(shè)備信息。
并且是使用UDP協(xié)議實現(xiàn)的,它生成一個UDP包,將自己的IP放入UDP協(xié)議頭中,然后從UDP包中獲取本機的IP。
這個方法實際上并沒有向外發(fā)送數(shù)據(jù)包,所以對抓包工具是不可見的。但是,它會申請一個UDP端口服務(wù)器運維,所以如果頻繁調(diào)用,會比較耗時。如果需要緩存查詢到的IP,可以大大提升性能。
注意:以上方法需要網(wǎng)卡配置網(wǎng)關(guān)(也可以用錯網(wǎng)關(guān))
# -*- conding:utf-8 -*-
# 使用utf8作為編碼格式
import socket
# 封裝成函數(shù),方便 Python 的程序調(diào)用
def get_host_ip():
try:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
a = socket.socket(socket.AF_INET)
s.connect(('8.8.8.8', 80))
ip = s.getsockname()[0]
finally:
s.close()
return ip
if __name__ == '__main__':
print(f"您當前的主機名為: {IPaddr()}")
print(f'當前IP為: {get_host_ip()}')
print('
')
運行結(jié)果
當然可以在shell中調(diào)用一行獲取服務(wù)器的本地IP
python -c "import socket;print([(s.connect(('8.8.8.8', 53)), s.getsockname()[0], s.close()) for s in [socket.socket(socket.AF_INET, socket.SOCK_DGRAM)]][0][1])"