Получить IP-адрес клиента в socket.io

При использовании socket.IO на сервере Node.js существует ли простой способ получить IP-адрес входящего соединения? Я знаю, что вы можете получить его из стандартного HTTP-соединения, но socket.io - это бит другого зверя.

Ответ 1

Хорошо, по состоянию на 0.7.7 это доступно, но не так, как описано в lubar. Мне пришлось анализировать некоторые журналы фиксации в концентраторе git, чтобы понять это, но следующий код действительно работает для меня сейчас:

var io = require('socket.io').listen(server);

io.sockets.on('connection', function (socket) {
  var address = socket.handshake.address;
  console.log('New connection from ' + address.address + ':' + address.port);
});

Ответ 2

для версии 1.0.4:

io.sockets.on('connection', function (socket) {
  var socketId = socket.id;
  var clientIp = socket.request.connection.remoteAddress;

  console.log(clientIp);
});

Ответ 3

Если вы используете другой сервер в качестве обратного прокси, все указанные поля будут содержать localhost. Самый простой способ - добавить заголовки для ip/port в прокси-сервер.

Пример для nginx: добавьте это после proxy_pass:

proxy_set_header  X-Real-IP $remote_addr;
proxy_set_header  X-Real-Port $remote_port;

Это сделает заголовки доступными на сервере socket.io node:

var ip = socket.handshake.headers["x-real-ip"];
var port = socket.handshake.headers["x-real-port"];

Обратите внимание, что заголовок внутренне преобразован в нижний регистр.

Если вы подключаете сервер node непосредственно к клиенту,

var ip = socket.conn.remoteAddress;

работает с socket.io версии 1.4.6 для меня.

Ответ 4

Для последней версии socket.io используйте

socket.request.connection.remoteAddress

Например:

var socket = io.listen(server);
socket.on('connection', function (client) {
  var client_ip_address = socket.request.connection.remoteAddress;
}

помните, что приведенный ниже код возвращает IP-адрес сервера, а не IP-адрес клиента

var address = socket.handshake.address;
console.log('New connection from ' + address.address + ':' + address.port);

Ответ 5

Используя последнюю версию 1.0.6 Socket.IO и разверните мое приложение на Heroku, я получаю клиентский IP и port с помощью headers в socket handshake:

var socketio = require('socket.io').listen(server);

socketio.on('connection', function(socket) {

  var sHeaders = socket.handshake.headers;
  console.info('[%s:%s] CONNECT', sHeaders['x-forwarded-for'], sHeaders['x-forwarded-port']);

}

Ответ 6

Версия 0.7.7 от Socket.IO теперь утверждает, что возвращает IP-адрес клиента. У меня был успех:

var socket = io.listen(server);
socket.on('connection', function (client) {
  var ip_address = client.connection.remoteAddress;
}

Ответ 7

Так как socket.io 1.1.0, я использую:

io.on('connection', function (socket) {
  console.log('connection :', socket.request.connection._peername);
  // connection : { address: '192.168.1.86', family: 'IPv4', port: 52837 }
}

Изменить: обратите внимание, что это не является частью официального API и, следовательно, не гарантируется работа в будущих версиях socket.io.

Также см. соответствующую ссылку: проблема engine.io

Ответ 8

Из чтения исходного кода socket.io он выглядит так: метод "listen" принимает аргументы (сервер, параметры, fn), и если "сервер" является экземпляром сервера HTTP/S, он просто завернет его для вас.

Итак, вы можете предположить, что это пустой сервер, который слушает событие "connection" и обрабатывает удаленный адрес сокета; однако, может быть очень сложно, если вам нужно связать этот адрес с фактическим объектом socket.io Socket.

var http = require('http')
  , io = require('socket.io');
io.listen(new http.Server().on('connection', function(sock) {
  console.log('Client connected from: ' + sock.remoteAddress);
}).listen(80));

Может быть проще отправить патч к socket.io, в котором их собственный объект Socket расширяется с помощью свойства remoteAddress, назначенного при времени подключения...

Ответ 9

Это работает:

var io = require('socket.io').listen(80);
io.sockets.on('connection', function (socket) {
  var endpoint = socket.manager.handshaken[socket.id].address;
  console.log('Client connected from: ' + endpoint.address + ":" + endpoint.port);
});

Ответ 10

Я обнаружил, что внутри socket.handshake.headers есть адрес переадресован для, который не отображается на моей локальной машине. И я смог получить удаленный адрес, используя:

socket.handshake.headers['x-forwarded-for']

Это на стороне сервера, а не на стороне клиента.

Ответ 11

Очень легко. Сначала поставьте

io.sockets.on('connection', function (socket) {

console.log(socket);

Вы увидите все поля сокета. затем используйте CTRL + F и найдите адрес слова. Наконец, когда вы найдете поле remoteAddress, используйте точки для фильтрации данных. в моем случае это

console.log(socket.conn.remoteAddress);

Ответ 12

В socket.io 2.0: вы можете использовать:

socket.conn.transport.socket._socket.remoteAddress

работает с transports: ['websocket']

Ответ 13

on socket.io 1.3.4 у вас есть следующие возможности.

socket.handshake.address,

socket.conn.remoteAddress или

socket.request.client._peername.address

Ответ 14

использовать socket.request.connection.remoteAddress

Ответ 15

Последняя версия работает с:

console.log(socket.handshake.address);

Ответ 16

В версии v2.3.0

эта работа для меня:

socket.handshake.headers['x-forwarded-for'].split(',')[0]

Ответ 17

В 1.3.5:

var clientIP = socket.handshake.headers.host;