我正在尝试设置显示访问者IP的页面。我尝试过的所有方法都显示出与我的计算机所具有的IP不同的IP。我试过了:
使用socket.getaddrinfo(socket.gethostname(),None)[0] [4] [0]
如何找到访客的真实IP?
答案 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地址。