সকেট প্রোগ্রামিংয়ে এএফপিইটি এবং পিএফএনপিইটির মধ্যে পার্থক্য কী?


205

সকেট প্রোগ্রামিংয়ে এএফপিইটি এবং পিএফএনপিইটির মধ্যে পার্থক্য কী?

আমি এএএনপিএনইটি এবং পিএফএনপিইটি ব্যবহারের মধ্যে বিভ্রান্ত socket() এবং bind()

এছাড়াও, sin_addrক্ষেত্রে আইপি-ঠিকানা দিতে কিভাবে ?


শুধু নেট অনুসন্ধান: এক ফল এই
অপ ডি Cirkel

আমি এটাও ভাবছিলাম। তারা বিভিন্ন কোডারদের মধ্যে সকেট কলগুলিতে বিনিময়যোগ্যভাবে ব্যবহার হবে বলে মনে হয়।
ম্যাট

@ ম্যাথএইচটি উভয়ই নতুন লিনাক্স কার্নেল অনুসারে সমান। আপনি নীচের ডিউকের উত্তরে একই সন্ধান করতে পারেন।
এসপি সন্ধু

উত্তর:


250

বিজের বিখ্যাত নেটওয়ার্ক প্রোগ্রামিং গাইডটি একটি দুর্দান্ত ব্যাখ্যা দেয়:

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


68

আমি লিনাক্স কার্নেল উত্স কোডে পেয়েছি যে পিএফএনপিইটি এবং এএফপিইটি একই রকম। নিম্নলিখিত কোডটি ফাইল থেকে লিনাক্স কার্নেল ৩.২.২১ গাছের লাইন / লিনাক্স / সকেট। অন্তর্ভুক্ত রয়েছে

/* Protocol families, same as address families. */
...
#define PF_INET     AF_INET

নিশ্চিত ডিউক, এটি পূর্ববর্তী কার্নেলগুলির জন্যও একই, আমি ভার্সন 3.0 এর পূর্বে কার্নেলগুলি বোঝাতে চাইছি?
এসপি সন্ধু

1
আমি যত তাড়াতাড়ি জানি, কার্নেল এবং libc এর সমস্ত সংস্করণে, পিএফ_ * == এএফ_ *
ডিউক

এটি কি নন-লিনাক্স প্ল্যাটফর্মে সত্য?
ভাল ব্যক্তি

1
আমি নিশ্চিত হয়েছি বলে মনে করি, আপনাকে অন্তর্ভুক্ত শিরোলেখ ফাইলটি পরীক্ষা করা দরকার :)
ডিউক

উবুন্টু / ডেবিয়ান-এ আমি এএফ সংজ্ঞা পেয়েছি/usr/src/linux-headers-<kernel_version>/include/linux/socket.h
পেট্রা জাভেরিক

48
  • এএফ = ঠিকানা পরিবার
  • পিএফ = প্রোটোকল পরিবার

অর্থ, AF_INET ইন্টারনেট থেকে নির্দিষ্ট ঠিকানাগুলি, আইপি অ্যাড্রেসগুলি নির্দিষ্ট করে।PF_INETপ্রোটোকলের যে কোনও কিছুকে সাধারণত সকেট / পোর্ট বোঝায়।

সকেট (2) এবং বাইন্ড (2) এর জন্য ম্যান পৃষ্ঠাগুলি পড়ার বিষয়ে বিবেচনা করুন । জন্য sin_addrক্ষেত্র, শুধু এটা সেট করতে নিচের মত কিছু করতে:

struct sockaddr_in addr;
inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr); 

ধন্যবাদ @ কোডেম্যাক, আমি addr.sin_addr.s_addr = inet_addr ("127.0.0.1") ব্যবহার করেছি; তবে ইনট_পটন () কীসের জন্য?
এসপি সন্ধু

ম্যান পেজগুলির জন্যও, যখন আমি ম্যান বাইন্ড (2) টাইপ করি বা ম্যান বাইন্ড () টাইপ করি, টার্মিনাল অপ্রত্যাশিত টোকেন দেয় '(' ত্রুটি যেখানে ম্যান বাইন্ড বাশ বিল্টিনগুলিতে বাইন্ডের ব্যাখ্যা দেয় gives বাইন্ড () ফাংশন?
এসপি সন্ধু

@ jatt.beas: বাক্য গঠনটি যেমন man <section> <topic>, যেমন man 2 bind
ফ্রেরিচ রাবাবে

11

আসলে, এএফ_ এবং পিএফ_ একই জিনিস। উইকিপিডিয়ায় কিছু শব্দ আপনার বিভ্রান্তি দূর করবে

প্রোটোকল টাইপ (পরিবার) এবং প্রতিটি ব্যবহার করতে পারে এমন নির্দিষ্ট ঠিকানা ধরণের মধ্যে পার্থক্যযুক্ত সকেট ইন্টারফেসের মূল নকশা ধারণা। এটি কল্পনা করা হয়েছিল যে কোনও প্রোটোকল পরিবারে বেশ কয়েকটি ঠিকানার প্রকার থাকতে পারে। ঠিকানা প্রকারগুলি অতিরিক্ত প্রতীকী ধ্রুবক দ্বারা PF_ এর পরিবর্তে উপসর্গ AF_ ব্যবহার করে সংজ্ঞায়িত করা হয়েছিল। এএফ_-শনাক্তকারীরা সমস্ত ডেটা স্ট্রাকচারের জন্য লক্ষ্যযুক্ত যা প্রোটোকল পরিবার নয়, ঠিকানার ধরণের সাথে বিশেষভাবে ডিল করে। তবে, প্রোটোকল এবং ঠিকানার ধরণের পৃথকীকরণের এই ধারণাটি বাস্তবায়ন সমর্থন খুঁজে পায় না এবং এএফ_-কনস্ট্যান্টগুলি কেবলমাত্র প্রাসঙ্গিক সনাক্তকারী দ্বারা এএফ_ বনাম পিএফ_ কনস্ট্যান্টের মধ্যে পার্থক্যটি উল্লেখযোগ্যভাবে ব্যবহারিক পরিণতির কোনও প্রযুক্তিগত যুক্তি উপস্থাপন করে সংজ্ঞায়িত করা হয়। সত্যই, উভয় ফর্মের যথাযথ ব্যবহারে অনেক বিভ্রান্তি রয়েছে।


4

এফএনইটিইটি = ঠিকানার ফর্ম্যাট, ইন্টারনেট = আইপি ঠিকানাগুলি

পিএফএনপিইটি = প্যাকেটের ফর্ম্যাট, ইন্টারনেট = আইপি, টিসিপি / আইপি বা ইউডিপি / আইপি

এএফপিইটিটি হ'ল ঠিকানা পরিবার যা আপনার তৈরি করা সকেটের জন্য ব্যবহৃত হয় (এক্ষেত্রে একটি ইন্টারনেট প্রোটোকল ঠিকানা)। উদাহরণস্বরূপ, লিনাক্স কার্নেল ইউএনআইএক্স সকেট এবং আইপিএক্সের মতো 29 টি অন্যান্য পরিবারকে সমর্থন করে এবং আইআরডিএ এবং ব্লুটুথের সাথে যোগাযোগ করে (এএফ_আইআরডিএ এবং এএফ_ ব্লুটুথ, তবে সন্দেহজনক যে আপনি এগুলি এত কম স্তরে ব্যবহার করবেন)।

কোনও নেটওয়ার্কে সকেট প্রোগ্রামিংয়ের জন্য বেশিরভাগ অংশের জন্য এএএনপিএনইটি দিয়ে স্টিক করা সবচেয়ে নিরাপদ বিকল্প।

অর্থ, এএফপিইটিটি বিশেষত ইন্টারনেট, আইপি ঠিকানা থেকে প্রাপ্ত ঠিকানাগুলিকে বোঝায়।

পিএফএনপিইটি প্রোটোকলের যে কোনও কিছুকে সাধারণত সকেট / পোর্ট বোঝায়।


3

এমন পরিস্থিতি রয়েছে যেখানে এটি গুরুত্বপূর্ণ।

যদি আপনি এএফপিইটি পাস করেন socket() আপনার সকেট এলোমেলোভাবে রিসেট হতে পারে বা নাও হতে পারে। পিএফএনপিইটি পাস করা নিশ্চিত করে যে সংযোগটি সঠিকভাবে কাজ করে।

সাইগউইন স্ব-স্বীকারোক্তিতে সকেট প্রোগ্রামিংয়ের জন্য একটি বিশাল জগাখিচুড়ি, তবে এটি এমন একটি আসল ওয়ার্ল্ড কেস যেখানে এএফএনপেট এবং পিএফএনপিইটি এক নয়।


6
দয়া করে ব্যাখ্যা করুন. আমি #define PF_INET AF_INETসাইগউইনে খুঁজে পাই socket.h
লার্নের মারকুইস

3

শিরোনাম ফাইলটি পরীক্ষা করা সমস্যার সমাধান। কেউ সেখানে সিস্টেম সংকলক পরীক্ষা করতে পারেন।

আমার সিস্টেমের জন্য, এএফ.এন.পি. == পিএফ.এন.পি.

এএফ == ঠিকানা পরিবার এবং পিএফ == প্রোটোকল পরিবার

প্রোটোকল পরিবার, ঠিকানার পরিবারগুলির মতো।

এখানে চিত্র বর্ণনা লিখুন


1
/usr/src/linux-headers-X.X.X-XX-generic/include/linux/socket.h
noobninja
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.