總是會有獲取本機 ip 的需求,但是就是這樣乙個簡單的需求處理起來還是有很多需要細化、明確的東東。
1 什麼是本機 ip?本機的外網 ip?本機的內網 ip?
2 是在 linux 上還是其他系統也要支援?
為此,咱今兒特意查了下谷歌娘,總結得到以下** 支援linux 32/64, solaris, win.但是這裡只是獲取了乙個 ip 而已,其他的需要可以在這個基礎上對**進行改造。
哦,對了,具體到要獲取外網 ip 的話,可以隨便向谷歌娘等發起乙個 http 請求然後獲取 ip。這也是乙個挺有趣的做法,**如下
s =socket.socket(socket.af_inet, socket.sock_dgram)s.connect((
"gmail.com
",80))
(s.getsockname()[0])
s.close()
這裡是正式的**
def_get_host_ip(self):
"""get a host ip. just return only one ip if there are many ips.
args:
none
returns:
a ip address string
raises:
runtimeerror
"""import
socket
import
struct
import
array
import
os ip = '
unknown
'siocgifconf = 0x8912size = 40 if sys.maxint > 2 ** 32 else 32max_possible = 8ip =socket.gethostbyname(socket.gethostname())
outbytes =0
try:
if ip.startswith("
127.
") and os.name != "nt"
:
import
fcntl
sock =socket.socket(socket.af_inet, socket.sock_dgram)
while
true:
bytes = max_possible *size
ifnames = array.array('
b', '
\0' *bytes)
outbytes = struct.unpack('il'
, fcntl.ioctl(
sock.fileno(),
siocgifconf,
struct.pack('il
', bytes, ifnames.buffer_info()[0])
))[0]
if outbytes ==bytes:
max_possible *= 2
else
:
break
nic_info =ifnames.tostring()
for idx in
range(0, outbytes, size):
ip = socket.inet_ntoa(nic_info[idx + 20:idx + 24])
if ip.startswith("
127."):
ip = '
unknown
'continue
else
:
break
except
socket.herror, e:
log.info(
"can not get host ip: %s
" %e)
raise runtimeerror("
failed to execute %s
" %e)
except
socket.error, e:
log.info(
"can not get host ip: %s
" %e)
raise runtimeerror("
failed to execute %s
" %e)
return ip
python 獲取本機 IP
這個方法是目前見過最優雅獲取本機伺服器的ip方法了。沒有任何的依賴,也沒有去猜測機器上的網路裝置資訊。而且是利用 udp 協議來實現的,生成乙個udp包,把自己的 ip 放如到 udp 協議頭中,然後從udp包中獲取本機的ip。這個方法並不會真實的向外部發包,所以用抓包工具是看不到的。但是會申請乙個...
python獲取linux本機IP
usr bin env python encoding utf 8 description get local ip address import os import socket,fcntl,struct def get ip 注意外圍使用雙引號而非單引號,並且假設預設是第乙個網絡卡,特殊環境請適...
python獲取本機ip位址
文章目錄 隱藏 在專案中使用 python udp,繫結時需要用到 ip 何埠,開始使用 socket.gethostbyname 時,當計算機名為中文時會提示,結果發現就是轉碼問題 socket.gaierror errno11004 getaddrinfo failedimport 獲取本機電腦...