it-swarm.com.de

Ruft die IP-Adresse des Clients in socket.io ab

Gibt es eine einfache Möglichkeit, bei Verwendung von socket.IO auf einem Node.js-Server die IP-Adresse einer eingehenden Verbindung abzurufen? Ich weiß, dass Sie es von einer Standard-HTTP-Verbindung bekommen können, aber socket.io ist ein etwas anderes Biest.

126
Toji

Okay, ab 0.7.7 ist dies verfügbar, aber nicht in der von lubar beschriebenen Weise. Am Ende musste ich einige Commit-Protokolle auf dem Git-Hub analysieren, um dies herauszufinden, aber der folgende Code funktioniert jetzt tatsächlich für mich:

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

für 1.0.4:

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

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

Wenn Sie einen anderen Server als Reverse-Proxy verwenden, enthalten alle genannten Felder localhost. Die einfachste Lösung ist das Hinzufügen von Headern für ip/port im Proxy-Server.

Beispiel für Nginx: Fügen Sie dies nach Ihrem proxy_pass:

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

Dadurch werden die Header auf dem socket.io-Knotenserver verfügbar:

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

Beachten Sie, dass der Header intern in Kleinbuchstaben konvertiert wird.

Wenn Sie den Knotenserver direkt mit dem Client verbinden,

var ip = socket.conn.remoteAddress;

funktioniert bei mir mit socket.io version 1.4.6.

39
zuim

Für die neueste Version von socket.io verwenden

socket.request.connection.remoteAddress

Beispielsweise:

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

beachten Sie, dass der folgende Code die IP des Servers und nicht die IP des Clients zurückgibt

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

Verwenden des neuesten 1.0.6 Version von Socket.IO und habe meine App auf Heroku implementiert, bekomme ich den Client IP und port mit dem headers in den 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

Seit Socket.io 1.1.0 verwende ich:

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

Bearbeiten : Beachten Sie, dass dies nicht Teil der offiziellen API ist und daher in zukünftigen Versionen von socket.io nicht garantiert funktioniert.

Siehe auch diesen relevanten Link: engine.io issue

5
nha

Version 0.7.7 von Socket.IO gibt nun die IP-Adresse des Clients zurück. Ich hatte Erfolg mit:

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

Aus dem Quellcode von socket.io geht hervor, dass die Methode "listen" Argumente (server, options, fn) akzeptiert, und wenn "server" eine Instanz eines HTTP/S-Servers ist, wird sie einfach für Sie verpackt.

Sie könnten ihm also vermutlich einen leeren Server geben, der auf das Ereignis 'connection' wartet und den Socket remoteAddress behandelt. Es kann jedoch sehr schwierig sein, diese Adresse einem tatsächlichen socket.io-Socket-Objekt zuzuordnen.

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

Es könnte einfacher sein, einen Patch an socket.io zu senden, in dem das eigene Socket-Objekt um die Eigenschaft remoteAddress erweitert wird, die zum Zeitpunkt der Verbindung zugewiesen wurde ...

4
maerics

Das scheint zu funktionieren:

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

Sehr leicht. Zuerst setzen

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

console.log(socket);

Sie sehen alle Felder von Socket. Verwenden Sie dann STRG + F, und suchen Sie die Wortadresse. Wenn Sie schließlich das Feld remoteAddress finden, verwenden Sie Punkte, um Daten zu filtern. in meinem Fall ist es

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

In socket.io 2.: können Sie verwenden:

socket.conn.transport.socket._socket.remoteAddress

arbeitet mit transports: ['websocket']

3
Chris'

Ich habe festgestellt, dass es in den socket.handshake.headers eine weitergeleitete Adresse gibt, die auf meinem lokalen Computer nicht angezeigt wird. Und ich konnte die entfernte Adresse erhalten mit:

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

Dies ist auf der Serverseite und nicht auf der Clientseite.

3
Ufb007

auf socket.io 1.3.4 Sie haben folgende Möglichkeiten.

socket.handshake.address,

socket.conn.remoteAddress oder

socket.request.client._peername.address

2
Yaki Klein

Neueste Version funktioniert mit:

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

verwenden socket.request.connection.remoteAddress

1
DuckHunter

In 1.3.5:

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