148 votes

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

Lorsque vous utilisez socket.io dans 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 une bête différente.

3 votes

Légère tangente, mais console.cat(socket) pourrait peut-être aider en vidant récursivement tout ce qui se trouve dans l'objet socket sur la console

4 votes

@izb Bon point, mais console.dir(socket) c'est peut-être ce que vous vouliez dire

169voto

Toji Points 12442

Ok, depuis la 0.7.7, c'est disponible, mais pas de la manière décrite par Lubar. J'ai fini par avoir besoin de parcourir certains journaux de commit sur git hub pour comprendre cela, mais le code suivant fonctionne 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);
});

0 votes

+1 merci mon pote, savez-vous peut-être comment je pourrais obtenir l'adresse distante - ou plutôt l'adresse d'origine ? Pour l'instant, je ne fais qu'enregistrer le transfert de mon routeur.

6 votes

Hum... parce que le sien est .connection.remoteAddress et le mien .handshake.address ?

0 votes

Et toujours avec la version 0.9.13, je reçois l'IP avec socket.handhsake.address.address sans problème. Merci !

79voto

flatroze Points 113

pour la version 1.0.4 :

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

  console.log(clientIp);
});

0 votes

Où avez-vous obtenu cette information ? Je pensais avoir lu toute la documentation sur socket.io et je n'avais pas vu ça. Cela a parfaitement fonctionné pour résoudre mes problèmes similaires à ceux du PO.

1 votes

Il suffit d'utiliser la socket console.log pour afficher toutes les informations disponibles, je crois qu'elles changent constamment car elles ne sont pas documentées.

6 votes

Dans la v1.2.1, socket.request.connection.remoteAddress y socket.request.connection.remotePort travailler pour moi. Cependant, je n'ai vu aucune de ces propriétés listées lorsque j'ai essayé : console.log(util.inspect(socket.request.connection, {showHidden: true, colors: true})); Pourquoi pas ?

23voto

SlyBeaver Points 599

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'IP du serveur et non l'IP du client.

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

2 votes

J'étais sur le point d'essayer ce code de poignée de main, merci de m'avoir signalé que c'est inutile ! !!

6 votes

Quelle version signifie "la dernière version de socket.io" ? Veuillez fournir une version spécifique.

0 votes

Dernières nouvelles pour juillet 2014

6voto

nha Points 898

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 }
}

Modifier : Notez que cela ne fait pas partie de l'API officielle et que son fonctionnement n'est donc pas garanti dans les futures versions de socket.io.

Voir également ce lien pertinent : problème de engine.io

1 votes

Confirmé avec la 1.3.3 également.

0 votes

@Rachael @ Codesleuth Merci pour la confirmation des versions, c'est très apprécié. Je reçois quelques upvotes donc je suppose que c'est encore valable, mais je n'ai pas testé moi-même.

4voto

Robert Larsen Points 246

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

1 votes

Cela renvoie toujours 127.0.0.1 pour moi, pas l'IP du client (node.js fonctionne sur un serveur distant).

0 votes

Essayer socket.request.connection.remoteAddress

0 votes

Veuillez indiquer la version de Socket.io que vous utilisiez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X