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


132

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


3
약간의 접선하지만 console.cat (소켓) 가능성이 반복적으로 콘솔에 소켓 객체의 모든 덤프의 도움을 수도
izb

4
@izb 좋은 지적이지만, console.dir(socket)당신이 의도 한 것일 수도 있습니다
LanguagesNamedAfterCofee

답변:


160

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

5
음 ... 그의 .connection.remoteAddress이고 내 것이 .handshake.address이기 때문에?
Toji

2
@GarciadelCastillo 당신은 아마도 프록시 뒤에 있습니다. 이것을 시도하십시오 : stackoverflow.com/a/11187053/971459
Samson

4
v1.0에서는 작동하지 않습니다. 호스트 주소 만 기록합니다.
Iest

1
버전 기준으로 1.3.7, 이것은 다음을 반환합니다::ffff:127.0.0.1
dmr07

3
socket.request.connection.remoteAddress1.x 버전 용
Lukas Liesis

72

1.0.4의 경우 :

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

  console.log(clientIp);
});

정보를 어디서 얻었습니까? socket.io에 대한 모든 문서를 읽었으며 이것을 보지 못했다고 생각했습니다. OP와 비슷한 문제를 해결하기 위해 완벽하게 작동했습니다.
MikeB 2016 년

1
사용 가능한 모든 정보를 보려면 console.log 소켓 만 문서화되어 있지 않기 때문에 계속 변경되고 있다고 생각합니다.
Pez Cuckow

6
V1.2.1에서, socket.request.connection.remoteAddress그리고 socket.request.connection.remotePort나를 위해 작동합니다. 그러나 시도했을 때 이러한 속성 중 하나가 나열 console.log(util.inspect(socket.request.connection, {showHidden: true, colors: true})); 되지 않았습니다.
Jeffrey LeCours

1
1.3.4에서도 작동합니다. 감사합니다
lima_fil

3
버전 기준으로 1.3.7, 이것은 다음을 반환합니다::ffff:127.0.0.1
dmr07

46

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


5
이것이 가장 좋은 해결책입니다. nodejs가 프록시 뒤에있는 경우 다른 답변이 작동하지 않습니다
Alfredo Gt

2
@zuim 선생님, 저의 영웅입니다!
Flavio

20

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

2
나는 그 악수 코드를 시험하려고했다, 그것이 쓸모가 없다는 것을 지적 해 주셔서 감사합니다!
RozzA

1
"lastest socket.io version"은 무슨 버전입니까? 특정 버전을 제공하십시오.
Akseli Palén

2014 년 7 월 최신
SlyBeaver

8

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

}

6

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


1
1.3.3으로도 확인되었습니다.
코드 루스

@Rachael @ Codesleuth 버전을 확인해 주셔서 감사합니다. 대단히 감사합니다. 나는 약간의 공감대를 얻고있어서 여전히 유효하다고 생각하지만, 나는 스스로 테스트하지 않았다.
nha

6

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

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

2
해당 client.conn.remoteAddress; 최신 버전에서.
Mujtaba Kably

4

이것은 작동하는 것 같습니다 :

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
이것은 127.0.0.1클라이언트의 IP가 아닌 항상 나를 위해 돌아옵니다 (node.js는 원격 서버에서 실행됩니다).
Daniel W.

socket.request.connection.remoteAddress 시도
Lukas Liesis

사용중인 Socket.io 버전을 제공하십시오.
Akseli Palén

4

socket.handshake.headers 내에 로컬 컴퓨터에 나타나지 않는 전달 된 주소 가 있음을 발견했습니다 . 그리고 다음을 사용하여 원격 주소를 얻을 수있었습니다.

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

이것은 클라이언트 측이 아닌 서버 측에 있습니다.


1
내가 시도한 다른 모든 것들이 ::ffff:127.0.0.1나에게 실제 IP를 주었다
Steven Pothoven

u를 사랑하십시오. 다른 모든 anwers는 루프백 ip를 제공합니다.이 헤더 만 작동합니다!
datdinhquoc

이것이 최신 버전 [2.2.0]의 솔루션입니다. 다른 모든 것은 나를 위해 서버 IP를 반환했습니다.
Abdul Sadik Yalcin

3

socket.io 소스 코드를 읽으면 "listen"메소드가 인수 (server, options, fn)를 취하는 것처럼 보이고 "server"가 HTTP / S 서버의 인스턴스 인 경우 간단히 랩핑합니다.

따라서 'connection'이벤트를 수신하고 소켓 remoteAddress를 처리하는 빈 서버를 제공 할 수 있습니다. 그러나 해당 주소를 실제 socket.io Socket 객체와 연결해야하는 경우 상황이 매우 어려울 수 있습니다.

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 속성으로 확장됩니다 ...


이 패치는 다음 릴리즈 github.com/LearnBoost/Socket.IO-node/pull/286에
Mak

3

아주 쉽게. 먼저 넣어

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

console.log(socket);

소켓의 모든 필드를 볼 수 있습니다. 그런 다음 Ctrl + F를 사용하여 단어 주소를 검색하십시오. 마지막으로, remoteAddress 필드를 찾으면 점을 사용하여 데이터를 필터링하십시오. 내 경우에는

console.log(socket.conn.remoteAddress);

오늘 나는 비슷한 문제에서 같은 해결책을 찾았습니다!
Filippo1980

이것은 클라이언트 엔드 포인트의 IP를 제공하지 않습니다. 필자의 경우 리버스 프록시 서버의 IP를 반환합니다.
Akseli Palén

3

socket.io 2.0 에서는 다음을 사용할 수 있습니다.

socket.conn.transport.socket._socket.remoteAddress

와 일하다 transports: ['websocket']


3

이것은 최신 2.3.0 버전 에서 작동합니다 .

io.on('connection', socket => {
   const ip = socket.handshake.headers[x-forwarded-for] || socket.conn.remoteAddress.split(":")[3];
   console.log(ip);
});

2

socket.io1.3.4 다음과 같은 가능성을 가지고있다.

socket.handshake.address,

socket.conn.remoteAddress 또는

socket.request.client._peername.address



1

사용하다 socket.request.connection.remoteAddress


4
버전 기준으로 1.3.7, 이것은 다음을 반환합니다::ffff:127.0.0.1
dmr07

1

최신 버전은 다음과 호환됩니다.

console.log(socket.handshake.address);

5
버전 기준으로 1.3.7, 이것은 다음을 반환합니다::ffff:127.0.0.1
dmr07

비슷한 1.4.8 :: ffff : 10.0.0.7
Xin

1
@ dmr07 이것은 IPv6 버전입니다. http 서버가 수신 대기하도록하여 IPv4를 강제 실행할 수 있습니다 0.0.0.0. 관련 : stackoverflow.com/a/37378670/5138796
darrachequesne

당신은 단지 IP를 127.0.0.1 인쇄됩니다 CONSOLE.LOG (socket.handshake.address.substring (7)) 할 수
node_man

1

typescript가 천천히 세계를 점령하는 2019 년에 오신 것을 환영합니다. 다른 답변은 여전히 ​​완벽하게 유효합니다. 그러나 입력 된 환경에서이를 설정하는 방법을 보여 드리고자합니다.

당신이 아직하지 않은 경우. 먼저 일부 종속성을 설치해야합니다 (예 : 명령 줄에서 npm install <dependency-goes-here> --save-dev).

  "devDependencies": {
    ...
    "@types/express": "^4.17.2",
    ...
    "@types/socket.io": "^2.1.4",
    "@types/socket.io-client": "^1.4.32",
    ...
    "ts-node": "^8.4.1",
    "typescript": "^3.6.4"
  }

ES6 가져 오기를 사용하여 가져 오기를 정의했습니다 ( tsconfig.json파일에서 먼저 활성화해야 함 ).

import * as SocketIO from "socket.io";
import * as http from "http";
import * as https from "https";
import * as express from "express";

타이프 스크립트를 사용하기 때문에 이제이 객체로 수행하는 모든 작업에 전체 입력이 있습니다.

따라서 먼저 http 서버가 필요합니다.

const handler = express();

const httpServer = (useHttps) ?
  https.createServer(serverOptions, handler) :
  http.createServer(handler);

나는 당신이 이미 모든 것을했다고 생각합니다. 그리고 이미 소켓 io를 추가했을 것입니다.

const io = SocketIO(httpServer);
httpServer.listen(port, () => console.log("listening") );
io.on('connection', (socket) => onSocketIoConnection(socket));

다음으로 새로운 socket-io 연결을 처리하기 위해 SocketIO.Socket매개 변수에 유형을 넣을 수 있습니다 .

function onSocketIoConnection(socket: SocketIO.Socket) {      
  // I usually create a custom kind of session object here.
  // then I pass this session object to the onMessage and onDisconnect methods.

  socket.on('message', (msg) => onMessage(...));
  socket.once('disconnect', (reason) => onDisconnect(...));
}

마지막으로 전체 입력이 완료되었으므로 추측하지 않고 소켓에서 쉽게 IP를 검색 할 수 있습니다.

const ip = socket.conn.remoteAddress;
console.log(`client ip: ${ip}`);

-1

1.3.5에서 :

var clientIP = socket.handshake.headers.host;

5
버전 기준으로 1.3.7이것은 ip가 아닌 페이지 URL을 반환합니다.
dmr07
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.