Python认为我是一个不同的IP

时间:2010-04-13 14:34:34

标签: python ip

我正在尝试设置显示访问者IP的页面。我尝试过的所有方法都显示出与我的计算机所具有的IP不同的IP。我试过了:

  1. 查找http://www.whatismyip.com/automation/n09230945.asp

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

  3. 如何找到访客的真实IP?

2 个答案:

答案 0 :(得分:4)

使用低级网络接口,您实际上正在获取运行python解释器的服务器的地址:

socket.gethostname():返回一个字符串,其中包含Python解释器当前正在执行的机器的主机名。

使用低级网络接口获取客户端IP

socket.accept()接受连接。套接字必须绑定到一个地址并监听连接。返回值是一对(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标题。请注意,HTTP_X_FORWARDED是一个数组,可以包含多个逗号分隔值,具体取决于代理的数量。

另请注意,您可能已被NAT(Network Address Translation)。如果您的IP是内部的(10.x.x.x或192.168.x.x,仅举几例),您肯定是在NAT路由器后面,只有您的外部IP将暴露给网站。

这是一个小的c#片段,显示确定客户端的ip,逻辑很容易转换python和服务器头是相同的:

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"];
}

答案 1 :(得分:0)

我找到了一个简单的解决方案:

import getenv
print getenv("REMOTE_ADDR")

这将返回连接到服务器的计算机的IP地址。