programing

socket.io 에서 클라이언트의 IP 주소 가져오기

muds 2023. 10. 13. 22:36
반응형

socket.io 에서 클라이언트의 IP 주소 가져오기

소켓 사용시.Node.js 서버의 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그리고 내 앱을 온(on)으로 배포합니다.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']);

}

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

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

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 의 향후 릴리스에서 작동할 것을 보장하지 않습니다.

관련 링크인 엔진도 참조하십시오.io호

소켓 버전 0.7.7.7입니다.IO는 이제 클라이언트의 IP 주소를 반환한다고 주장합니다.성공적인 성과를 거두었습니다.

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

작동하는 것 같습니다.

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

아주 쉽습니다.퍼스트 퍼트

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

console.log(socket);

소켓의 모든 필드가 표시됩니다.그런 다음 CTRL+F를 사용하여 주소라는 단어를 검색합니다.마지막으로 remoteAddress 필드를 찾으면 점을 사용하여 데이터를 필터링합니다.나 같은 경우는

console.log(socket.conn.remoteAddress);

나는 소켓 안에서 그것을 발견했습니다. 악수.내 로컬 컴퓨터에 나타나지 않는 주소에 대해 전달된 헤더가 있습니다.그리고 다음을 이용해 원격 주소를 얻을 수 있었던 방법은 다음과 같습니다.

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

이것은 서버측에 있고 클라이언트측에 있지 않습니다.

v2.3.0 버전

나를 위한 이 일 :

socket.handshake.headers['x-forwarded-for'].split(',')[0]

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

따라서 아마도 '연결' 이벤트를 수신하고 소켓 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));

연결 시 할당된 remoteAddress 속성으로 자체 소켓 개체가 확장되는 패치를 socket.io 에 제출하는 것이 더 쉬울 수 있습니다.

위에socket.io과 같은 1.3.4다.

socket.handshake.address,

socket.conn.remoteAddress아니면

socket.request.client._peername.address

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

socket.conn.transport.socket._socket.remoteAddress

와 함께 transports: ['websocket']

블로그 게시물을 훑어보고 심지어 사람들이 그 질문에 대한 답도 했습니다.

나는 노력했다.socket.handshake.address작동은 했지만 접두사는 ::fffff:입니다.

그걸 제거하기 위해 regex를 사용해야 했습니다.

버전 4.0.1에서 작동합니다.

socket.conn.remoteAddress

타이프스크립트가 서서히 세계를 점령하는 2019년을 환영합니다.다른 대답들은 여전히 완벽하게 유효합니다.하지만, 저는 여러분이 어떻게 이것을 타이핑된 환경에서 설정할 수 있는지 보여주고 싶었을 뿐입니다.

아직 못 봤을 때.먼저 몇 가지 종속성(예: 명령줄)을 설치해야 합니다.

  "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 imports(파일에서 먼저 활성화해야 함)를 사용하여 Imports를 정의했습니다.

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

당신은 이미 그 모든 것을 했었나 봐요.아마도 이미 소켓 아이오를 추가했을 것입니다.

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

클라이언트의 IP 주소를 가져오는 방법(v 3.1.0)은 다음과 같습니다.


// Current Client
const ip = socket.handshake.headers["x-forwarded-for"].split(",")[1].toString().substring(1, this.length);
// Server 
const ip2 = socket.handshake.headers["x-forwarded-for"].split(",")[0].toString();

그리고 작동하는지 확인하려면 geoplugin.net/json.gsp?ip=로 이동하여 링크의 IP를 전환해야 합니다.그렇게 한 후에는 고객의 정확한 위치를 알려줄 것이고, 이는 작동했다는 것을 의미합니다.

사용하다socket.request.connection.remoteAddress

최신 버전은 다음과 함께 작동합니다.

console.log(socket.handshake.address);

나 같은 경우에는

나는 나의 것을 바꿉니다.

app.configure(socketio)

로.

app.configure(socketio(function(io) {
 io.use(function (socket, next) {
   socket.feathers.clientIP = socket.request.connection.remoteAddress;
   next();
 });
}));

저는 이렇게 ip를 받을 수 있습니다.

function checkIP() {
  return async context => {
    context.data.clientIP = context.params.clientIP
  }
}

module.exports = {
  before: {
    all: [],
    find: [
      checkIp()
    ]}
  }

1.3.5에서:

var clientIP = socket.handshake.headers.host;

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

반응형