ग्राहक के आईपी पते को socket.io में प्राप्त करें


132

Node.js सर्वर में सॉकेट.IO का उपयोग करते समय, क्या आने वाले कनेक्शन का आईपी पता प्राप्त करने का एक आसान तरीका है? मुझे पता है कि आप इसे एक मानक HTTP कनेक्शन से प्राप्त कर सकते हैं, लेकिन socket.io एक अलग जानवर का एक सा है।


3
थोड़ा स्पर्श, लेकिन कंसोल.कैट (सॉकेट) ने संभवतः कंसोल पर सॉकेट ऑब्जेक्ट में सब कुछ डंपिंग द्वारा मदद की हो सकती है
izb

4
@ मिज़ गुड पॉइंट, लेकिन console.dir(socket)हो सकता है कि आपका क्या मतलब हो
LanguageNamedAfterCofee

जवाबों:


160

ठीक है, 0.7.7 तक यह उपलब्ध है, लेकिन उस तरीके से नहीं जैसा कि लुबर वर्णन करता है। मैंने इसे समाप्त करने के लिए 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);
});

5
उम ... क्योंकि उसका है .connection.remoteAddress और मेरा है .handshake.address?
Toji

2
@GarciadelCastillo आप शायद एक प्रॉक्सी के पीछे हैं। इसे आज़माएं: stackoverflow.com/a/11187053/971459
सैमसन

4
V1.0 में काम नहीं करता है - यह सिर्फ मेरे लिए होस्ट का पता लॉग करता है।
iest

1
संस्करण के रूप में 1.3.7, यह रिटर्न::ffff:127.0.0.1
dmr07

3
socket.request.connection.remoteAddress1.x संस्करण के लिए
लुकास लेसिसिस

72

1.0.4 के लिए:

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

  console.log(clientIp);
});

आपको जानकारी कहां से मिली? मैंने सोचा कि मैंने सॉकेट के लिए सभी डॉक्स पढ़े हैं। यह नहीं देखा। इसने ओपी के समान मेरी समस्याओं को हल करने के लिए पूरी तरह से काम किया।
मिकबी

1
उपलब्ध जानकारी के सभी देखने के लिए बस कंसोल.लॉग सॉकेट, मेरा मानना ​​है कि यह बदलता रहता है क्योंकि यह दस्तावेज नहीं है।
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})); क्यों नहीं?
जेफरी लेकोर्स

1
1.3.4 में भी काम करता है। धन्यवाद
lima_fil

3
संस्करण के रूप में 1.3.7, यह रिटर्न::ffff:127.0.0.1
dmr07

46

यदि आप किसी अन्य सर्वर को रिवर्स प्रॉक्सी के रूप में उपयोग करते हैं, तो सभी उल्लिखित फ़ील्ड में लोकलहोस्ट होगा। छद्म सर्वर में आईपी / पोर्ट के लिए हेडर जोड़ना सबसे आसान काम है।

उदाहरण के लिए nginx: इसे अपने बाद जोड़ें proxy_pass:

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

यह हेडर को सॉकेट में उपलब्ध कराएगा।

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
यह सबसे अच्छा समाधान है, अन्य उत्तर काम नहीं करते हैं यदि नोड्ज एक प्रॉक्सी के पीछे है
अल्फ्रेडो जीटी

2
@ ज़ुइम यू सर, मेरे हीरो हैं!
फ्लाविओ

20

नवीनतम सॉकेट के लिए। संस्करण का उपयोग करें

socket.request.connection.remoteAddress

उदाहरण के लिए:

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

सावधान रहें कि नीचे दिया गया कोड सर्वर का आईपी लौटाता है, क्लाइंट का आईपी नहीं

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

2
मैं उस हैंडशेक कोड को आज़माने वाला था, यह बताने के लिए धन्यवाद कि यह बेकार है !!
रोजा

1
"नवीनतम सॉकेट.io संस्करण" का क्या अर्थ है? कृपया विशिष्ट संस्करण प्रदान करें।
अक्सेली पलन

2014 के जुलाई के लिए नवीनतम
SlyBeaver

8

के नवीनतम 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']);

}

6

सॉकेट के बाद से। 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 }
}

संपादित करें : ध्यान दें कि यह आधिकारिक एपीआई का हिस्सा नहीं है, और इसलिए सॉकेट के भविष्य के रिलीज में काम करने की गारंटी नहीं है।

इस प्रासंगिक लिंक को भी देखें: engine.io समस्या


1
1.3.3 के साथ भी पुष्टि की।
कोडस्लेथ

@Rachael @ Codesleuth संस्करणों के लिए पुष्टि के लिए धन्यवाद, यह बहुत सराहना की है। मुझे कुछ अपवोट मिल रहे हैं तो मुझे लगता है कि यह अभी भी मान्य है, लेकिन मैंने खुद का परीक्षण नहीं किया है।
न्हा

6

सॉकेट.IO का संस्करण 0.7.7 अब ग्राहक के आईपी पते को वापस करने का दावा करता है। मुझे इसके साथ सफलता मिली है:

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

2
इसके मुवक्किल .conn.remoteAddress; नए संस्करणों में।
मुजतबा 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मेरे लिए लौटता है, न कि क्लाइंट का आईपी (नोड। रिमोट सर्वर पर चलता है)।
डैनियल डब्ल्यू

socket.request.connection.remoteAddress
Lukas Liesis

कृपया सॉकेट प्रदान करें। आप जिस संस्करण का उपयोग कर रहे थे।
अक्सेली पलन

4

मैंने पाया है कि सॉकेट.हैंडशेक.हेडर्स के भीतर एड्रेस के लिए फॉरवर्ड किया गया है जो मेरे लोकल मशीन पर नहीं दिखता है। और मैं दूरस्थ पते का उपयोग करने में सक्षम था:

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

यह सर्वर साइड में है न कि क्लाइंट साइड में।


1
बाकी सब मैंने कोशिश की, ::ffff:127.0.0.1लेकिन इसने मुझे
स्टीवन पोथोवन

लव यू, अन्य सभी awers मुझे लूपबैक आईपी देते हैं, केवल यह हेडर काम करता है!
डेटिनडोकॉक

यह नवीनतम संस्करण [२.२.०] के लिए समाधान है। बाकी सब कुछ मेरे लिए सर्वर आईपी लौटा दिया।
अब्दुल सादिक यालसिन

3

सॉकेट.आईओ स्रोत कोड को पढ़ने से ऐसा लगता है कि "सुनो" विधि तर्कों (सर्वर, विकल्प, fn) को लेती है और यदि "सर्वर" एक HTTP / S सर्वर का एक उदाहरण है तो यह बस इसे आपके लिए लपेट देगा।

तो आप संभवतः इसे एक खाली सर्वर दे सकते हैं जो 'कनेक्शन' इवेंट के लिए सुनता है और सॉकेट रिमोटएड्रेस संभालता है; हालाँकि, चीजें बहुत मुश्किल हो सकती हैं यदि आपको उस पते को एक वास्तविक सॉकेट के साथ जोड़ने की आवश्यकता हो। सॉकेट ऑब्जेक्ट।

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

एक सॉकेट के लिए एक पैच सबमिट करना आसान हो सकता है जिसमें अपनी स्वयं की सॉकेट ऑब्जेक्ट को कनेक्शन के लिए असाइन किए गए रिमोटएड्रेस संपत्ति के साथ बढ़ाया जाता है ...


इस पैच को संभवतः अगली रिलीज़ github.com/LearnBoost/Socket.IO-node/pull/286
mak

3

बहुत आसान। पहले डाल दिया

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

console.log(socket);

आपको सॉकेट के सभी क्षेत्र दिखाई देंगे। फिर CTRL + F का उपयोग करें और शब्द पता खोजें। अंत में, जब आप पाते हैं कि क्षेत्र रिमोटअंड्रेस डेटा को फ़िल्टर करने के लिए डॉट्स का उपयोग करता है। मेरे मामले में यह है

console.log(socket.conn.remoteAddress);

आज मुझे एक ही मामले में एक ही समाधान मिला!
Filippo1980

यह क्लाइंट एंडपॉइंट का आईपी नहीं देता है। मेरे मामले में यह सिर्फ रिवर्स प्रॉक्सी सर्वर का आईपी लौटाता है।
अक्सेली पलन

3

सॉकेट में। 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

आप कंसोल.लॉग (socket.handshake.address.substring (7)) कर सकते हैं, यह सिर्फ IP 127.0.0.1
नोड_मान

1

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

मैंने ईएस 6 आयातों का उपयोग करते हुए आयातों को परिभाषित किया (जो आपको अपनी 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));

अगला, नए सॉकेट-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(...));
}

और फिर अंत में, क्योंकि अब हमारे पास पूर्ण टाइपिंग है, हम आसानी से अनुमान लगाए बिना अपने सॉकेट से आईपी को पुनः प्राप्त कर सकते हैं:

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

-1

1.3.5 में:

var clientIP = socket.handshake.headers.host;

5
संस्करण के रूप में 1.3.7, यह पृष्ठ यूआरएल यूआरएल है, आईपी नहीं
dmr07
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.