İstemcinin IP adresini socket.io'dan alın


133

Bir Node.js sunucusunda socket.IO kullanırken, gelen bir bağlantının IP adresini almanın kolay bir yolu var mı? Bunu standart bir HTTP bağlantısından alabileceğinizi biliyorum, ancak socket.io biraz farklı bir canavar.


3
Biraz teğet, ancak console.cat (soket) muhtemelen soket nesnesindeki her şeyi konsola yinelemeli olarak dökerek yardımcı olmuş olabilir
izb

4
@izb İyi nokta, ama console.dir(socket)demek istediğiniz şey olabilir
LanguagesNamedAfterCofee

Yanıtlar:


160

Tamam, 0.7.7 itibariyle bu mevcut, ancak Lubar'ın tarif ettiği şekilde değil. Bunu anlamak için git hub'daki bazı commit günlüklerini ayrıştırmam gerekti, ancak şu kod aslında benim için çalışıyor:

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
Um ... çünkü onun .connection.remoteAddress ve benimki .handshake.address mi?
Toji

2
@GarciadelCastillo muhtemelen bir proxy'nin arkasındasınız. bunu deneyin: stackoverflow.com/a/11187053/971459
Samson

4
V1.0'da çalışmıyor - sadece benim için ana bilgisayarın adresini kaydediyor.
son

1
Sürüm itibariyle 1.3.7bu,::ffff:127.0.0.1
dmr07

3
socket.request.connection.remoteAddress1.x sürümü için
Lukas Liesis

73

1.0.4 için:

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

  console.log(clientIp);
});

Bilgiyi nereden aldın? Socket.io'nun tüm belgelerini okuduğumu ve bunu görmediğimi sanıyordum. OP'ye benzer sorunlarımı çözmek için mükemmel çalıştı.
MikeB

1
Mevcut tüm bilgileri görüntülemek için sadece console.log soketi, belgelenmediği için değişmeye devam ettiğine inanıyorum.
Pez Cuckow

6
V1.2.1'de socket.request.connection.remoteAddressve socket.request.connection.remotePortbenim için çalış. Ancak, denediğimde bu özelliklerden hiçbirinin listelendiğini görmedim: console.log(util.inspect(socket.request.connection, {showHidden: true, colors: true})); Neden olmasın?
Jeffrey LeCours

1
1.3.4'te de çalışır. Teşekkürler
lima_fil

3
Bu, sürüm itibariyle 1.3.7geri döner::ffff:127.0.0.1
dmr07

46

Ters proxy olarak başka bir sunucu kullanırsanız, belirtilen tüm alanlar localhost'u içerecektir. En kolay çözüm, proxy sunucusunda ip / bağlantı noktası için üstbilgiler eklemektir.

Nginx için örnek: şunu ekleyin proxy_pass:

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

Bu, başlıkları socket.io düğüm sunucusunda kullanılabilir hale getirecektir:

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

Başlığın dahili olarak küçük harfe dönüştürüldüğünü unutmayın.

Düğüm sunucusunu doğrudan istemciye bağlıyorsanız,

var ip = socket.conn.remoteAddress;

benim için socket.io sürüm 1.4.6 ile çalışıyor.


5
Bu en iyi çözüm, nodejs bir proxy'nin arkasındaysa diğer yanıtlar işe yaramıyor
Alfredo Gt

2
@zuim Siz efendim, benim kahramanımsınız!
Flavio

20

En son socket.io sürümünü kullanmak için

socket.request.connection.remoteAddress

Örneğin:

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

Aşağıdaki kodun, İstemcinin IP'sini değil, Sunucunun IP'sini döndürdüğüne dikkat edin

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

2
o el sıkışma kodunu denemek üzereydim, işe yaramaz olduğuna işaret ettiğiniz için teşekkürler !!
RozzA

1
"En son socket.io sürümü" ile hangi sürüm kastedilmektedir? Lütfen belirli bir sürümü sağlayın.
Akseli Palén

En son Temmuz 2014
SlyBeaver

8

Son kullanma 1.0.6sürümünü Socket.IOve benim app dağıtılan var Herokuİstemci olsun, IPve portkullanma headersiçine 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'dan beri kullanıyorum:

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

Düzenleme : Bunun resmi API'nin bir parçası olmadığını ve bu nedenle socket.io'nun gelecekteki sürümlerinde çalışmasının garanti edilmediğini unutmayın.

Ayrıca şu ilgili bağlantıya bakın: engine.io sorunu


1
1.3.3 ile de onaylandı.
Codesleuth

@Rachael @ Codesleuth Sürümler için onay için teşekkürler, çok takdir edilmektedir. Birkaç olumlu oy alıyorum, bu yüzden bu hala geçerli, ancak kendimi test etmedim.
nha

6

Socket.IO'nun 0.7.7 sürümü artık istemcinin IP adresini iade ettiğini iddia ediyor. Şunlarla başarılı oldum:

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

2
client.conn.remoteAddress; yeni versiyonlarda.
Mujtaba Kably

4

Bu işe yarıyor gibi görünüyor:

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
Bu her zaman 127.0.0.1benim için döner , istemcinin IP'si değil (node.js uzak sunucuda çalışır).
Daniel W.

socket.request.connection.remoteAddress
Lukas Liesis

Lütfen kullandığınız Socket.io sürümünü sağlayın.
Akseli Palén

4

Socket.handshake.headers içinde yerel makinemde görünmeyen yönlendirilmiş bir adres olduğunu buldum. Ve şunu kullanarak uzak adresi alabildim:

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

Bu, sunucu tarafında ve istemci tarafında değil.


1
Denediğim her şey geri verildi ::ffff:127.0.0.1ama bu bana gerçek IP'yi verdi
Steven Pothoven

seni seviyorum, diğer tüm cevaplar bana geri döngü ipi veriyor, sadece bu başlık çalışıyor!
datdinhquoc

Bu, en son sürüm [2.2.0] için çözümdür. Diğer her şey benim için sunucu ip'i döndürdü.
Abdul Sadık Yalçın

3

Socket.io kaynak kodunu okumaktan, "listen" yöntemi bağımsız değişkenler alıyor gibi görünür (sunucu, seçenekler, fn) ve eğer "sunucu" bir HTTP / S sunucusunun bir örneğiyse, onu sizin için sarmalayacaktır.

Bu nedenle, ona "bağlantı" olayını dinleyen ve remoteAddress soketini işleyen boş bir sunucu verebilirsiniz; ancak, bu adresi gerçek bir socket.io Socket nesnesiyle ilişkilendirmeniz gerekirse işler çok zor olabilir.

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

Soket.io'ya bir yama göndermek daha kolay olabilir, burada kendi Socket nesnesi bağlantı sırasında atanan remoteAddress özelliğiyle genişletilir ...


Bu yama büyük olasılıkla bir sonraki github.com/LearnBoost/Socket.IO-node/pull/286
mak

3

Çok kolay. İlk koy

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

console.log(socket);

Soketin tüm alanlarını göreceksiniz. daha sonra CTRL + F tuşlarını kullanın ve kelime adresini arayın. Son olarak, remoteAddress alanını bulduğunuzda verileri filtrelemek için noktaları kullanın. benim durumumda

console.log(socket.conn.remoteAddress);

Bugün aynı çözümü benzer bir konuda buldum!
Filippo1980

Bu, istemci uç noktasının IP'sini vermez. Benim durumumda, sadece ters proxy sunucusunun IP'sini döndürür.
Akseli Palén

3

Socket.io 2.0'da : şunları kullanabilirsiniz:

socket.conn.transport.socket._socket.remoteAddress

ile çalışır transports: ['websocket']


3

Bu, en son 2.3.0 sürümü için çalışır :

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

2

üzerinde socket.io1.3.4 Aşağıdaki seçenekler var.

socket.handshake.address,

socket.conn.remoteAddress veya

socket.request.client._peername.address


2

V2.3.0 sürümünde

bu benim için çalışıyor:

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

1

kullanım socket.request.connection.remoteAddress


4
Sürüm itibariyle 1.3.7bu,::ffff:127.0.0.1
dmr07

1

En son sürüm şunlarla çalışır:

console.log(socket.handshake.address);

5
Sürüm itibariyle 1.3.7, bu şu döndürür::ffff:127.0.0.1
dmr07

benzer 1.4.8 :: ffff: 10.0.0.7
Xin

1
@ dmr07 bu IPv6 sürümüdür. Http sunucusunun dinlemesini sağlayarak IPv4'ü zorlayabilirsiniz 0.0.0.0. İlgili: stackoverflow.com/a/37378670/5138796
darrachequesne

console.log'u yapabilirsiniz (socket.handshake.address.substring (7)) sadece ip 127.0.0.1 yazdıracaktır
node_man

1

Daktilo yazısının yavaş yavaş dünyayı ele geçirdiği 2019'a hoş geldiniz. Diğer cevaplar hala tamamen geçerlidir. Ancak, bunu yazılı bir ortamda nasıl kurabileceğinizi size göstermek istedim.

Henüz yapmadıysanız. Önce bazı bağımlılıkları yüklemek gerekir (komut ile yani: 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"
  }

İçe aktarımları ES6 içe aktarımlarını kullanarak tanımladım ( tsconfig.jsonönce dosyanızda etkinleştirmeniz gerekir .)

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

Daktilo kullandığım için şu anda bu nesnelerle yaptığım her şeyde tam yazı yazıyorum.

Yani, açıkçası, önce bir http sunucusuna ihtiyacınız var:

const handler = express();

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

Sanırım hepsini zaten yaptın. Ve muhtemelen zaten ona soket io eklediniz:

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

Daha sonra, yeni soket-io bağlantılarının işlenmesi için, SocketIO.Sockettürü parametresine koyabilirsiniz .

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

Ve son olarak, artık tam yazı yazabildiğimiz için, ip'i tahmin etmeden soketimizden kolayca alabiliriz:

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

-1

1.3.5'te:

var clientIP = socket.handshake.headers.host;

5
Sürüm itibarıyla 1.3.7bu, ip değil sayfa url'sini döndürür
dmr07
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.