web-dev-qa-db-ja.com

socket.ioでクライアントのIPアドレスを取得します

Node.jsサーバーでsocket.IOを使用する場合、着信接続のIPアドレスを取得する簡単な方法はありますか?標準のHTTP接続から取得できることは知っていますが、socket.ioは少し違うものです。

126
Toji

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

1.0.4の場合:

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

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

他のサーバーをリバースプロキシとして使用する場合、上記のすべてのフィールドにlocalhostが含まれます。最も簡単な回避策は、プロキシサーバーにip/portのヘッダーを追加することです。

Nginxの例:proxy_passの後にこれを追加します:

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

これにより、ヘッダーがsocket.ioノードサーバーで使用可能になります。

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

ヘッダーは内部的に小文字に変換されることに注意してください。

ノードサーバーをクライアントに直接接続している場合、

var ip = socket.conn.remoteAddress;

socket.ioバージョン1.4.6で動作します。

39
zuim

最新の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);
20
SlyBeaver

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

}
8
Balthazar

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

Edit:これは公式APIの一部ではないため、socket.ioの将来のリリースでの動作が保証されないことに注意してください。

この関連リンクも参照してください: engine.io issue

5
nha

Socket.IOのバージョン0.7.7は、クライアントのIPアドレスを返すと主張しています。私は成功しました:

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

Socket.ioのソースコードを読むと、「listen」メソッドは引数(server、options、fn)を取り、「server」がHTTP/Sサーバーのインスタンスである場合、単純にラップしているように見えます。

したがって、おそらく「connection」イベントをリッスンし、ソケットremoteAddressを処理する空のサーバーを提供できます。ただし、そのアドレスを実際のsocket.ioソケットオブジェクトに関連付ける必要がある場合は、非常に困難な場合があります。

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にパッチを送信する方が簡単な場合があります。この場合、接続時に割り当てられたremoteAddressプロパティで独自のSocketオブジェクトが拡張されます...

4
maerics

これはうまくいくようです:

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

非常に簡単。まず

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

console.log(socket);

ソケットのすべてのフィールドが表示されます。次に、CTRL + Fを使用して、Wordアドレスを検索します。最後に、フィールドremoteAddressが見つかったら、ドットを使用してデータをフィルタリングします。私の場合は

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

Socket.ioで2.:使用できます:

socket.conn.transport.socket._socket.remoteAddress

transports: ['websocket']で動作します

3
Chris'

Socket.handshake.headers内にforwarded forアドレスがあり、これがローカルマシンに表示されないことがわかりました。そして、私は次を使用してリモートアドレスを取得することができました:

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

これはクライアント側ではなくサーバー側にあります。

3
Ufb007

socket.io 1.3.4では、次の可能性があります。

socket.handshake.address

socket.conn.remoteAddressまたは

socket.request.client._peername.address

2
Yaki Klein

最新バージョンは以下で動作します:

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

socket.request.connection.remoteAddressを使用します

1
DuckHunter

1.3.5で:

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