2010-04-13 40 views
2

我試圖設置一個顯示訪問者IP的頁面。我嘗試過的所有方法都顯示出與我的計算機的IP不同的IP。我已經試過:Python認爲我是一個不同的IP

  1. 仰望http://www.whatismyip.com/automation/n09230945.asp

  2. 使用socket.getaddrinfo(socket.gethostname(),無)[0] [4] [0]

如何我可以找到訪問者的真實IP嗎?

+0

你在filewall或nat路由器後面嗎? 是蟒蛇說你的東西像192.168 ....或10.10 ....? 你想知道你的外部IP地址? – 2010-04-13 14:37:54

+0

根據whatismyip,我的IP是128.2.xxx.xxx 根據Python,我的IP是72.47.xxx。xxx – Yongho 2010-04-13 14:41:20

+0

你的python服務器在本地工作網絡或互聯網上在哪裏?像tracert或traceroute等工具可以幫助您確定服務器的位置,如果您不知道的話。 – vfilby 2010-04-13 14:43:29

回答

0

我發現了一個簡單的解決方案:

import getenv 
print getenv("REMOTE_ADDR") 

這將返回連接到服務器的計算機的IP地址。

+1

正如我在上面的答案中所述,您可以使用該標題,但它不代表代理服務器。更多信息在我的答案 – vfilby 2010-04-13 20:18:18

4

使用你實際上是讓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"]; 
} 
相關問題