Используя низкоуровневый сетевой интерфейс, вы фактически получаете адрес сервера, на котором работает интерпретатор 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()
Подробнее о сетевом интерфейсе низкого уровня
Получение IP-адреса клиента из заголовков HTTP (при обслуживании html)
REMOTE_ADDR
- заголовок, который содержит IP-адрес клиента, который вы должны сначала проверить.
Вам также следует проверить заголовок HTTP_X_FORWARDED
на случай, если вы посещаете прокси-сервер. Помните, что HTTP_X_FORWARDED
- это массив, который может содержать несколько значений, разделенных запятыми, в зависимости от количества прокси.
Также имейте в виду, что вы можете иметь NAT ( Трансляция сетевых адресов ). Если ваш 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"];
}