Socket.io এ ক্লায়েন্টের আইপি ঠিকানা পান


132

নোড.জেএস সার্ভারে সকেট.আইও ব্যবহার করার সময়, আগত সংযোগের আইপি ঠিকানা পাওয়ার কোনও সহজ উপায় কী? আমি জানি আপনি এটি একটি স্ট্যান্ডার্ড এইচটিটিপি সংযোগ থেকে পেতে পারেন তবে সকেট.ইও কিছুটা আলাদা জন্তু।


3
সামান্য স্পর্শকাতর, তবে কনসোল.ক্যাট (সকেট) সম্ভবত সকেট অবজেক্টের সমস্ত কিছু কনসোলের উপরে পুনরাবৃত্তভাবে ডাম্প করে সহায়তা করেছিল
izb

4
@ আইজবি ভাল বক্তব্য, তবে console.dir(socket)আপনি যা বোঝাতে চেয়েছিলেন তা হতে পারে
ল্যাঙ্গুয়েজসনমেডএফটারকফি

উত্তর:


160

ঠিক আছে, 0.7.7 হিসাবে এটি উপলভ্য, তবে লুবার বর্ণনা করার মতো নয়। এটিকে বের করার জন্য আমি গিট হাবের কিছু প্রতিশ্রুতিবদ্ধ লগগুলি বিশ্লেষণের প্রয়োজন শেষ করেছি, তবে নিম্নলিখিত কোডটি এখন আমার পক্ষে আসলে কাজ করে:

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
উম ... কারণ তার। সংযোগ.আমোট অ্যাড্রেস এবং আমার .handshake.address?
তোজি

2
@ গার্সিয়াডেল কাস্টিলো আপনি সম্ভবত একটি প্রক্সি এর পিছনে রয়েছেন। এটি ব্যবহার করে দেখুন: stackoverflow.com/a/11187053/971459
স্যামসন

4
V1.0 এ কাজ করে না - এটি আমার জন্য হোস্টের ঠিকানাটি লগ করে।
ইস্ট

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

আপনি কোথায় তথ্য পেয়েছেন? আমি ভেবেছিলাম আমি সকেট.ইওর জন্য সমস্ত দস্তাবেজ পড়েছি এবং এটি দেখিনি। এটি ওপির মতো আমার সমস্যাগুলি সমাধান করার জন্য পুরোপুরি কাজ করেছিল worked
মাইকবি

1
উপলব্ধ সমস্ত তথ্য দেখতে কেবল কনসোল.লগ সকেট, আমি বিশ্বাস করি এটি পরিবর্তন করে চলেছে কারণ এটি নথিভুক্ত নয়।
পেজ ককো

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 এও কাজ করে। ধন্যবাদ
লীমা_ফিল

3
সংস্করণ হিসাবে 1.3.7, এই রিটার্ন::ffff:127.0.0.1
dmr07

46

যদি আপনি অন্য সার্ভারটি উল্টো প্রক্সি হিসাবে ব্যবহার করেন তবে উল্লিখিত সমস্ত ক্ষেত্রের লোকালহোস্ট থাকবে। প্রক্সি সার্ভারে আইপি / পোর্টের জন্য শিরোনাম যুক্ত করা সবচেয়ে সহজ কাজ।

এনগিনেক্সের উদাহরণ: এটির পরে এটি যুক্ত করুন 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;
}

সাবধান! নীচের কোডটি ক্লায়েন্টের আইপি নয়, সার্ভারের আইপি প্রদান করে returns

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

2
আমি সেই হ্যান্ডশেক কোডটি চেষ্টা করতে যাচ্ছিলাম, এটি অকেজো দেখানোর জন্য ধন্যবাদ !!
রোজএ

1
"সর্বশেষতম সকেট.ইও সংস্করণ" বলতে কোন সংস্করণ বোঝানো হয়েছে? দয়া করে নির্দিষ্ট সংস্করণ সরবরাহ করুন।
আকসেলি পালান

2014 সালের জুলাইয়ের জন্য সর্বশেষ
স্লাই বিভার

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

সকেট.ইও ১.১.০ থেকে আমি ব্যবহার করি:

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

সম্পাদনা করুন : নোট করুন যে এটি অফিশিয়াল এপিআই-র অংশ নয়, এবং তাই ভবিষ্যতে सॉকেট.আইওর কাজ করার গ্যারান্টিযুক্ত নয়।

এই প্রাসঙ্গিক লিঙ্কটিও দেখুন : ইঞ্জিন.ইও ইস্যু


1
1.3.3 এর সাথেও নিশ্চিত হয়েছে।
কোডসলেথ

@ র্যাচেল @ কোডস্লুথ সংস্করণগুলির জন্য নিশ্চিতকরণের জন্য ধন্যবাদ, এটি অনেক প্রশংসিত। আমি কয়েকটি উঁচুতে পাচ্ছি তাই আমার ধারণা এটি এখনও কার্যকর আছে তবে আমি নিজে পরীক্ষা করিনি।
এনএইচ

6

সকেটের সংস্করণ 0.7.7.আইও এখন ক্লায়েন্টের আইপি ঠিকানা ফেরত দেওয়ার দাবি করে। আমি এর সাথে সাফল্য পেয়েছি:

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

2
এটির ক্লায়েন্ট.কোন.রেমোটএড্রেস; নতুন সংস্করণে।
মুজতবা কাবলি

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 চেষ্টা করুন
লুকাশ লিসিস

আপনি ব্যবহার করছিলেন দয়া করে Socket.io সংস্করণ সরবরাহ করুন।
আকসেলি পালান

4

আমি খুঁজে পেয়েছি যে সকেট.হ্যান্ডশেক.হেডারের মধ্যে ঠিকানাটির জন্য একটি ফরোয়ার্ড রয়েছে যা আমার স্থানীয় মেশিনে উপস্থিত হয় না। এবং আমি ব্যবহার করে দূরবর্তী ঠিকানা পেতে সক্ষম হয়েছি:

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

এটি সার্ভারের পাশে এবং ক্লায়েন্টের পাশে নয়।


1
আমি যা কিছু চেষ্টা ::ffff:127.0.0.1করেছি সেগুলি ফিরে এসেছিল তবে এটি আমাকে আসল আইপি দিয়েছে
স্টিভেন পোথোভেন 21

তোমাকে ভালবাসি, অন্য সমস্ত উত্তর আমাকে লুপব্যাক আইপি দেয়, কেবল এই শিরোলেখ কাজ করে!
ডাটদিনহোকোক

এটি সর্বশেষতম সংস্করণ [২.২.০] এর সমাধান। অন্য সব কিছু আমার জন্য সার্ভার আইপি ফিরিয়ে দিয়েছে।
আবদুল সাদিক ইয়ালসিন

3

সকেট.ইও উত্স কোডটি পড়ার থেকে দেখে মনে হচ্ছে "শুনুন" পদ্ধতিটি আর্গুমেন্ট নেয় (সার্ভার, বিকল্পগুলি, এফএন) এবং যদি "সার্ভার" কোনও এইচটিটিপি / এস সার্ভারের উদাহরণ হয় তবে এটি কেবল আপনার জন্য এটি আবৃত করবে।

সুতরাং আপনি সম্ভবত এটি একটি খালি সার্ভার দিতে পারেন যা 'সংযোগ' ইভেন্টের জন্য শোনায় এবং সকেট রিমোটএড্রেস পরিচালনা করে; তবে, যদি আপনার সেই ঠিকানাটি একটি আসল সকেট.ইও সকেট অবজেক্টের সাথে যুক্ত করতে হয় তবে জিনিসগুলি খুব কঠিন হতে পারে।

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/Sket.IO-node/pull/286
ম্যাক

3

খুব সহজ. প্রথম রাখুন

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

console.log(socket);

আপনি সকেটের সমস্ত ক্ষেত্র দেখতে পাবেন। তারপরে CTRL + F ব্যবহার করুন এবং শব্দ ঠিকানাটি অনুসন্ধান করুন। অবশেষে, আপনি যখন ক্ষেত্রটি রিমোটএড্রেস খুঁজে পাবেন ডেটা ফিল্টার করতে বিন্দুগুলি ব্যবহার করুন। আমার ক্ষেত্রে এটি হয়

console.log(socket.conn.remoteAddress);

আজ আমি একই সমাধানে একই সমাধান খুঁজে পেয়েছি!
ফিলিপো 1980

এটি ক্লায়েন্টের শেষ পয়েন্টের আইপি দেয় না। আমার ক্ষেত্রে এটি কেবল বিপরীত প্রক্সি সার্ভারের আইপি ফিরিয়ে দেয়।
আকসেলি পালান

3

সকেট.ইও 2.0- এ : আপনি ব্যবহার করতে পারেন:

socket.conn.transport.socket._socket.remoteAddress

সঙ্গে কাজ করে transports: ['websocket']


3

এটি সর্বশেষতম ২.৩.০ সংস্করণের জন্য কাজ করে :

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
জিন

1
@ dmr07 এটি আইপিভি 6 সংস্করণ। আপনি HTTP সার্ভারটি শ্রবণ করে আইপিভি 4কে জোর করতে পারেন 0.0.0.0। সম্পর্কিত: stackoverflow.com/a/37378670/5138796
darrachequesne

আপনি কনসোল.লগ করতে পারেন (সকেট.হ্যান্ডশেক.এডড্রেস.সুবস্ট্রিং (7)) এটি কেবল আইপি 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"
  }

আমি 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);

আমার ধারণা আপনি ইতিমধ্যে সমস্ত কিছু করে ফেলেছেন। এবং আপনি সম্ভবত ইতিমধ্যে এটিতে সকেট আইও যুক্ত করেছেন:

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

এর পরে, নতুন সকেট-আইও সংযোগগুলি পরিচালনা করার জন্য, আপনি টাইপটিকে 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}`);

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.