web-dev-qa-db-fra.com

Récupère l'adresse IP du client dans socket.io

Lors de l'utilisation de socket.IO sur un serveur Node.js, existe-t-il un moyen simple d'obtenir l'adresse IP d'une connexion entrante? Je sais que vous pouvez l'obtenir à partir d'une connexion HTTP standard, mais socket.io est un peu différent.

126
Toji

Ok, à partir de 0.7.7, ceci est disponible, mais pas de la manière décrite par lubar. J'ai finalement eu besoin d'analyser certains journaux de commit sur git hub pour comprendre celui-ci, mais le code suivant fonctionne réellement pour moi maintenant:

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);
});
153
Toji

pour 1.0.4:

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

  console.log(clientIp);
});
68
flatroze

Si vous utilisez un autre serveur comme proxy inverse, tous les champs mentionnés contiendront localhost. La solution de contournement la plus simple consiste à ajouter des en-têtes pour ip/port dans le serveur proxy.

Exemple pour nginx: ajoutez ceci après votre proxy_pass:

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

Cela rendra les en-têtes disponibles dans le serveur de noeud socket.io:

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

Notez que l'en-tête est converti en interne en minuscule.

Si vous connectez le serveur de noeud directement au client,

var ip = socket.conn.remoteAddress;

fonctionne avec socket.io version 1.4.6 pour moi.

39
zuim

Pour la dernière version de socket.io, utilisez

socket.request.connection.remoteAddress

Par exemple:

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

attention, le code ci-dessous renvoie l'adresse IP du serveur et non celle du client.

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

En utilisant la dernière 1.0.6 version de Socket.IO et que mon application soit déployée sur Heroku, je récupère le client IP et port à l’aide de headers dans le 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']);

}
8
Balthazar

Depuis socket.io 1.1.0, j'utilise:

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

Edit : Notez que cela ne fait pas partie de l'API officielle et qu'il n'est donc pas garanti que cela fonctionnera dans les futures versions de socket.io.

Voir également ce lien pertinent: numéro de engine.io

5
nha

La version 0.7.7 de Socket.IO prétend maintenant renvoyer l'adresse IP du client. J'ai eu du succès avec:

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

D'après la lecture du code source de socket.io, il semble que la méthode "listen" prenne des arguments (serveur, options, fn) et si "serveur" est une instance d'un serveur HTTP/S, il l'enveloppera simplement pour vous.

Donc, vous pourriez probablement lui donner un serveur vide qui écoute l'événement 'connection' et gère la socket remoteAddress; cependant, les choses peuvent être très difficiles si vous devez associer cette adresse à un objet socket.io Socket réel.

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));

Il serait peut-être plus facile de soumettre un correctif à socket.io dans lequel leur propre objet Socket est étendu avec la propriété remoteAddress attribuée au moment de la connexion ...

4
maerics

Cela semble fonctionner:

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);
});
4
Robert Larsen

Très facile. D'abord mis

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

console.log(socket);

Vous verrez tous les champs de socket. puis utilisez CTRL + F et recherchez l'adresse Word. Enfin, lorsque vous trouvez le champ remoteAddress, utilisez des points pour filtrer les données. dans mon cas c'est

console.log(socket.conn.remoteAddress);
3
geniant

Dans socket.io 2.: vous pouvez utiliser:

socket.conn.transport.socket._socket.remoteAddress

marche avec transports: ['websocket']

3
Chris'

J'ai trouvé que dans socket.handshake.headers il y a une adresse transmise pour qui n'apparaît pas sur ma machine locale. Et j'ai pu obtenir l'adresse à distance en utilisant:

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

C'est du côté du serveur et non du côté client.

3
Ufb007

sur socket.io 1.3.4 vous avez les possibilités suivantes.

socket.handshake.address,

socket.conn.remoteAddress ou

socket.request.client._peername.address

2
Yaki Klein

La dernière version fonctionne avec:

console.log(socket.handshake.address);
1
Khanasyubighi

utilisation socket.request.connection.remoteAddress

1
DuckHunter

En 1.3.5:

var clientIP = socket.handshake.headers.Host;
1
user4294073