<p>使用低级网络接口,您实际上可以获得运行python解释器的服务器地址:</p>
<p>“<em>套接字.gethostname():返回一个字符串,其中包含当前正在执行Python解释器的计算机的主机名。</em>“</p>
<p><strong>使用低级网络接口获取客户端ip</strong></p>
<p>“<em>插座.接受()接受连接。套接字必须绑定到地址并侦听连接。返回值是一对(conn,address),其中conn是一个新的套接字对象,可用于在连接上发送和接收数据,address是绑定到连接另一端的套接字的地址。</em>“</p>
<pre><code># 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()
</code></pre>
<p><a href="http://docs.python.org/library/socket.html" rel="nofollow noreferrer">More info on the low level network interface</a></p>
<p><strong>从HTTP头获取客户端IP(如果提供html)</strong></p>
<p><code>REMOTE_ADDR</code>是包含客户端ip地址的头,您应该首先检查它。在</p>
<p>如果您的访问者正在通过代理,您还应该检查<code>HTTP_X_FORWARDED</code>报头。请注意,<code>HTTP_X_FORWARDED</code>是一个数组,它可以包含多个逗号分隔的值,具体取决于代理的数量。在</p>
<p>也要注意,你可能是被激怒了(<a href="http://en.wikipedia.org/wiki/Network_address_translation" rel="nofollow noreferrer">Network Address Translation</a>)。如果你的ip是内部的(10.x.x.x或192.168.x.x等等),你肯定在NAT路由器后面,只有你的外部ip才会暴露在网站上。在</p>
<p>下面是一个小的c代码片段,显示了如何确定客户机的ip,逻辑很容易转换python和服务器头是相同的:</p>
^{pr2}$