development

socket.io에서 클라이언트의 IP 주소를 가져옵니다

big-blog 2020. 7. 6. 07:08
반응형

socket.io에서 클라이언트의 IP 주소를 가져옵니다


Node.js 서버에서 socket.IO를 사용할 때 들어오는 연결의 IP 주소를 얻는 쉬운 방법이 있습니까? 표준 HTTP 연결에서 얻을 수 있다는 것을 알고 있지만 socket.io는 약간 다른 짐승입니다.


0.7.7부터는 루바가 설명하는 방식으로 사용할 수 없지만 사용할 수 있습니다. 나는 이것을 알아 내기 위해 git hub의 커밋 로그를 파싱해야했지만 결국 다음 코드가 실제로 작동합니다.

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

1.0.4의 경우 :

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

  console.log(clientIp);
});

다른 서버를 리버스 프록시로 사용하는 경우 언급 된 모든 필드에 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에서 작동합니다.


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

의 최신 1.0.6버전을 사용하고에 Socket.IO응용 프로그램을 배포 Heroku하면 클라이언트 IPport사용하여 다음 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']);

}

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 문제


Socket.IO 버전 0.7.7은 이제 클라이언트의 IP 주소를 반환한다고 주장합니다. 나는 성공했다 :

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

From reading the socket.io source code it looks like the "listen" method takes arguments (server, options, fn) and if "server" is an instance of an HTTP/S server it will simply wrap it for you.

So you could presumably give it an empty server which listens for the 'connection' event and handles the socket remoteAddress; however, things might be very difficult if you need to associate that address with an actual socket.io Socket object.

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

Might be easier to submit a patch to socket.io wherein their own Socket object is extended with the remoteAddress property assigned at connection time...


This seems to work:

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

I have found that within the socket.handshake.headers there is a forwarded for address which doesn't appear on my local machine. And I was able to get the remote address using:

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

This is in the server side and not client side.


Very easy. First put

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

console.log(socket);

You will see all fields of socket. then use CTRL+F and search the word address. Finally, when you find the field remoteAddress use dots to filter data. in my case it is

console.log(socket.conn.remoteAddress);

In socket.io 2.0: you can use:

socket.conn.transport.socket._socket.remoteAddress

works with transports: ['websocket']


on socket.io 1.3.4 you have the following possibilities.

socket.handshake.address,

socket.conn.remoteAddress or

socket.request.client._peername.address


use socket.request.connection.remoteAddress


Latest version works with:

console.log(socket.handshake.address);

In 1.3.5 :

var clientIP = socket.handshake.headers.host;

참고URL : https://stackoverflow.com/questions/6458083/get-the-clients-ip-address-in-socket-io

반응형