我試圖設置一個顯示訪問者IP的頁面。我嘗試過的所有方法都顯示出與我的計算機的IP不同的IP。我已經試過:Python認爲我是一個不同的IP
使用socket.getaddrinfo(socket.gethostname(),無)[0] [4] [0]
如何我可以找到訪問者的真實IP嗎?
我試圖設置一個顯示訪問者IP的頁面。我嘗試過的所有方法都顯示出與我的計算機的IP不同的IP。我已經試過:Python認爲我是一個不同的IP
使用socket.getaddrinfo(socket.gethostname(),無)[0] [4] [0]
如何我可以找到訪問者的真實IP嗎?
我發現了一個簡單的解決方案:
import getenv
print getenv("REMOTE_ADDR")
這將返回連接到服務器的計算機的IP地址。
正如我在上面的答案中所述,您可以使用該標題,但它不代表代理服務器。更多信息在我的答案 – vfilby 2010-04-13 20:18:18
使用你實際上是讓Python解釋器上運行的服務器的地址的低級別的網絡接口:
「socket.gethostname():返回包含計算機的主機名的字符串,其中的Python解釋器當前正在執行。socket.accept()接受一個連接「
使用低級網絡接口
獲取客戶端IP」。該插座必須綁定到地址並監聽連接。返回值是一對(conn,address),其中conn是一個新的套接字對象,可用於在連接上發送和接收數據,地址是綁定到連接另一端的套接字的地址。「
# Echo server program
import socket
HOST = '' # Symbolic name meaning all available interfaces
PORT = 50007 # Arbitrary non-privileged port
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print 'Connected by', addr
while 1:
data = conn.recv(1024)
if not data: break
conn.send(data)
conn.close()
More info on the low level network interface
從HTTP頭獲取客戶端IP(如果提供HTML)
REMOTE_ADDR
是包含客戶端的IP地址,你應該檢查第一頭。
您也應該檢查HTTP_X_FORWARDED
標頭,以防您的訪客正在通過代理。 t HTTP_X_FORWARDED
是一個可以包含多個逗號分隔值的數組,取決於代理的數量。
另外請注意,您可能是NAT(Network Address Translation)。如果你的ip是內部的(10.x.x.x或192.168.x.x等等),你肯定是在NAT路由器後面,只有你的外部IP纔會暴露給網站。
這裏是一個小的C#代碼片段,顯示確定客戶端的IP,邏輯很容易轉換的蟒蛇和服務器頭是一樣的:
string clientIp = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if(!string.IsNullOrEmpty(clientIp)) {
string[] forwardedIps = clientIp.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
clientIp = forwardedIps[forwardedIps.Length - 1];
} else {
clientIp = context.Request.ServerVariables["REMOTE_ADDR"];
}
你在filewall或nat路由器後面嗎? 是蟒蛇說你的東西像192.168 ....或10.10 ....? 你想知道你的外部IP地址? – 2010-04-13 14:37:54
根據whatismyip,我的IP是128.2.xxx.xxx 根據Python,我的IP是72.47.xxx。xxx – Yongho 2010-04-13 14:41:20
你的python服務器在本地工作網絡或互聯網上在哪裏?像tracert或traceroute等工具可以幫助您確定服務器的位置,如果您不知道的話。 – vfilby 2010-04-13 14:43:29