সকেট প্রোগ্রামিংয়ের জন্য INADDR_ANY বোঝা


86

আমি কিছু সকেট প্রোগ্রাম করার চেষ্টা করছি এবং তাই, সার্ভার সাইডে, আমি ব্যবহার করি htonl(INADDR_ANY)। আমি যে পরিমাণে বুঝতে পেরেছি, আমার কাছে মনে হচ্ছে এই ফাংশনটি এলোমেলো আইপি উত্পন্ন করে (আমি কি সঠিক?) আসলে, আমি আমার সকেটটি আমার সাথে আবদ্ধ করতে চাই localhost। তবে আমি যদি এই চালাতে

আমি রিটার্ন মান হিসাবে 0 পাই। কেউ কিছু ব্যাখ্যা আনতে পারে?


10
" ... আমি ব্যবহার করি htonl(INADDR_ANY)। ডক বলেছেন যে এই ফাংশনটি এলোমেলো আইপি উত্পন্ন করে ... " এটি সঠিক নয়। কোন ডক্স আপনাকে তাই বলে?
alk

4
@ ডাল, আসলে আমি বিভ্রান্ত করেছি: আমি কিছু পিডিএফ পড়ছিলাম যা আমি ভেবেছিলাম কিছু অফিসিয়াল ডকুমেন্টেশন। আমি এখনই আমার পোস্টটি সম্পাদনা করছি
এপসিলোনস

উত্তর:


137
  1. bind()এর মধ্যে "একটি এলোমেলো আইপি উত্পন্ন INADDR_ANYহয় না "। এটি সকেটটি সমস্ত উপলব্ধ ইন্টারফেসের সাথে আবদ্ধ করে

  2. একটি সার্ভারের জন্য, আপনি সাধারণত সমস্ত ইন্টারফেসের সাথে বাঁধতে চান - কেবল "লোকালহোস্ট" নয়।

  3. যদি আপনি নিজের সকেটটিকে কেবল লোকালহোস্টে আবদ্ধ করতে চান তবে বাক্য গঠনটি হবে my_sockaddress.sin_addr.s_addr = inet_addr("127.0.0.1");, তারপরে কল করুন bind(my_socket, (SOCKADDR *) &my_sockaddr, ...)

  4. যেমনটি ঘটে, INADDR_ANYএকটি ধ্রুবক যা "শূন্য" এর সমান হয়:

    http://www.castaglia.org/proftpd/doc/devel-guide/src/incolve/inet.h.html

  5. আপনি যদি এর সাথে ইতিমধ্যে পরিচিত না হন তবে আমি আপনাকে সকেট প্রোগ্রামিংয়ের জন্য বিজের গাইড পরীক্ষা করার জন্য অনুরোধ করছি:

    http://beej.us/guide/bgnet/

যেহেতু লোকেরা এখনও এটি পড়ছে, তাই একটি অতিরিক্ত নোট:

মানুষ (7) আইপি :

যখন কোনও প্রক্রিয়া নতুন আগত প্যাকেট বা সংযোগ পেতে চায়, তখন এটি সকেটটিকে বাইন্ড (2) ব্যবহার করে স্থানীয় ইন্টারফেসের ঠিকানায় আবদ্ধ করা উচিত ।

এই ক্ষেত্রে, শুধুমাত্র একটি আইপি সকেট যে কোনও স্থানীয় (ঠিকানা, পোর্ট) জুটির সাথে আবদ্ধ হতে পারে। যখন INADDR_ANY বাইন্ড কলটিতে নির্দিষ্ট করা থাকে, সকেটটি সমস্ত স্থানীয় ইন্টারফেসের সাথে আবদ্ধ থাকবে।

যখন শুনুন (2) আনবাউন্ড সকেটে কল করা হয়, সকেটটি স্বয়ংক্রিয়ভাবে INADDR_ANY এ স্থানীয় ঠিকানা সেট করে একটি এলোমেলো মুক্ত পোর্টে আবদ্ধ হয়।

যখন সংযুক্ত (2) আনবাউন্ড সকেটে কল করা হয়, সকেটটি স্বয়ংক্রিয়ভাবে একটি এলোমেলো মুক্ত পোর্ট বা INADDR_ANY তে স্থানীয় ঠিকানা সেট করে একটি ব্যবহারযোগ্য ভাগ করা বন্দরের সাথে আবদ্ধ হয় ...

বেশ কয়েকটি বিশেষ ঠিকানা রয়েছে: INADDR_LOOPBACK (127.0.0.1) সর্বদা লুপব্যাক ডিভাইসের মাধ্যমে স্থানীয় হোস্টকে বোঝায়; INADDR_ANY (০.০.০.০) অর্থ বাঁধার জন্য কোনও ঠিকানা ...

এছাড়াও:

বাইন্ড () - একটি সকেটে একটি নাম বাঁধুন :

যদি (sin_addr.s_addr) ক্ষেত্রটি নেটিনিট / ইন.কে সংজ্ঞায়িত হিসাবে ধ্রুবক INADDR_ANY তে সেট করা থাকে, কলার অনুরোধ করে যে সকেটটি হোস্টের সমস্ত নেটওয়ার্ক ইন্টারফেসের সাথে আবদ্ধ হতে হবে। পরবর্তীকালে, সমস্ত ইন্টারফেসের (যা সীমাবদ্ধ নামের সাথে মেলে) থেকে ইউডিপি প্যাকেট এবং টিসিপি সংযোগগুলি অ্যাপ্লিকেশনটিতে স্থানান্তরিত হয়। যখন সার্ভার একাধিক নেটওয়ার্কগুলিতে কোনও পরিষেবা সরবরাহ করে তখন এটি গুরুত্বপূর্ণ হয়ে ওঠে। ঠিকানাটি অনির্ধারিত রেখে, সার্ভারটি তার পোর্টের জন্য তৈরি সমস্ত ইউডিপি প্যাকেট এবং টিসিপি সংযোগের অনুরোধ গ্রহণ করতে পারে, অনুরোধটি যে নেটওয়ার্ক ইন্টারফেসে এসেছিল তা নির্বিশেষে।


4
এর অর্থ এই নয় যে 'সমস্ত ইন্টারফেসে আবদ্ধ'। এটি যদি করে, নেটস্প্যাট আউটপুট ভিন্ন হবে। এর অর্থ 'যে কোনও ইন্টারফেসে শুনুন '।
ব্যবহারকারী 207421

7
উপরের লিঙ্কটি উদ্ধৃত করার জন্য: "যখন INADDR_ANY বাইন্ড কলটিতে নির্দিষ্ট করা থাকে, সকেটটি সমস্ত স্থানীয় ইন্টারফেসের সাথে আবদ্ধ থাকবে" " অন্য লিঙ্ক থেকে: "INADDR_ANY" মানটির অর্থ হ'ল আমরা স্থানীয় কম্পিউটারে থাকা যে কোনও / সমস্ত আইপি ঠিকানাগুলিকে আবদ্ধ করব । তবে হ্যাঁ - অনেকগুলি প্রয়োগ প্রথম ইন্টারফেসের সাথে আবদ্ধ হবে , ("সমস্ত" নয়)। তবে একটি এনআইসিসহ একটি পিসির জন্য পার্থক্যটি একাডেমিক। INADDR_ANY এর সাথে ক্লায়েন্টটি যে কোনও / সমস্ত আইপি'র সাথে সংযোগ করতে পারে (উদাহরণস্বরূপ 192.168.1.2 এবং 127.0.0.1 উভয়)।
পলস্ম 4

6
দুঃখিত এটি যদি একটি মূ ?় প্রশ্ন হয় তবে ইন্টারফেসের অর্থ কি ওয়্যারলেস, ইথারনেট ইত্যাদি?
mrQWERTY

4
@ laike9m আপনি কেবল স্থানীয় মেশিন থেকে সকেটে সংযোগ করতে সক্ষম হতে চাইলে আপনি 127.0.0.1 এ আবদ্ধ হন। এটির জন্য ব্যবহারের কেসগুলি রয়েছে যখন সকেটের দ্বারা প্রদত্ত পরিষেবাটি কেবলমাত্র অন্য কোনও প্রক্রিয়া যা মেশিনে স্থানীয় তা ব্যবহার করার উদ্দেশ্যে তৈরি হয়।
22-29 এ dgnuff

4
@ paulsm4 3-এ, আপনি কি এর INADDR_LOOPBACKপরিবর্তে ব্যবহার করতে পারবেন না inet_addr("127.0.0.1")?
জন স্ট্রুড

63

INADDR_ANYযখন আপনাকে কোনও নির্দিষ্ট আইপিতে কোনও সকেট বাঁধতে হবে না তখন ব্যবহৃত হয়। কল করার সময় আপনি যখন এই মানটি ঠিকানা হিসাবে ব্যবহার bind()করেন, সকেটটি মেশিনের সমস্ত আইপি-তে সংযোগ গ্রহণ করে।


8

করার বেঁধে দিয়ে সকেট স্থানীয় হোস্ট ডাকা, আগে আপনি বেঁধে ফাংশন, sockaddr_in কাঠামো sin_addr.s_addr ক্ষেত্র সঠিকভাবে নির্ধারণ করা উচিত। সঠিক মান হয় উভয় দ্বারা প্রাপ্ত করা যেতে পারে

অথবা দ্বারা


4

INADDR_ANYশোনার সকেটকে সমস্ত উপলব্ধ ইন্টারফেসের সাথে বাঁধতে নির্দেশ দেয়। এটি আবদ্ধ করার চেষ্টা করার মতোই inet_addr("0.0.0.0")। সম্পূর্ণতার জন্য আমি আরও উল্লেখ করব যে আইপিভি 6 এর জন্য IN6ADDR_ANY_INIT রয়েছে এবং এটি আইপিভি 6 সকেটের জন্য সম্বোধনের সাথে আবদ্ধ হওয়ার চেষ্টা করার মতো ::

এছাড়াও, মনে রাখবেন যে আপনি যখন আইপিভি 6 সকেটটি IN6ADDR_ANY_INITআপনার সকেটে বাঁধেন তখন সমস্ত আইপিভি 6 ইন্টারফেসের সাথে আবদ্ধ হয়ে যায় এবং আইপিভি 4 ক্লায়েন্টের সাথে সংযোগ গ্রহণ করতে সক্ষম হওয়া উচিত (যদিও আইপিভি 6-ম্যাপযুক্ত ঠিকানা))


2

INADDR_ANY একটি ধ্রুবক, যার মান 0 থাকে। এটি কেবল তখনই ব্যবহার করা হবে যখন আপনি আইপি-অ্যাডের বিষয়ে চিন্তা করেন না এমন সমস্ত সক্রিয় পোর্ট থেকে সংযোগ চান। সুতরাং আপনি যদি কোনও নির্দিষ্ট আইপি সংযোগ করতে চান তবে আপনাকে আমার_সোকাড্রেস.সিন_অ্যাড.আর.এস_এডিডিআর = ইনট_এডিড্রির মতো উল্লেখ করতে হবে ("192.168.78.2")

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