সকেট.শুটডাউন বনাম সকেট.ক্লস


122

আমি সম্প্রতি কিছুটা কোড দেখেছি যা দেখতে এরকম দেখাচ্ছে (মোজা অবশ্যই একটি সকেট অবজেক্ট হিসাবে):

sock.shutdown(socket.SHUT_RDWR)
sock.close()

সকেটে শাটডাউন কল করা এবং তারপরে এটি বন্ধ করার উদ্দেশ্য কী? যদি এটি কোনও পার্থক্য করে, এই সকেটটি আইও-অবরুদ্ধকরণের জন্য ব্যবহৃত হচ্ছে।

উত্তর:


38

এখানে একটি ব্যাখ্যা :

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


241

অন্তর্নিহিত সকেটে কলিং closeএবং shutdownদুটি পৃথক প্রভাব রয়েছে।

প্রথমটি উল্লেখ করার জন্য হ'ল সকেটটি অন্তর্নিহিত ওএসের একটি সংস্থান এবং একাধিক প্রক্রিয়াতে একই অন্তর্নিহিত সকেটের জন্য একটি হ্যান্ডেল থাকতে পারে।

আপনি যখন closeএটি কল করেন তখন হ্যান্ডেল গণনাটি একে একে হ্রাস পায় এবং যদি হ্যান্ডেলের গণনাটি শূন্যে পৌঁছে যায় তবে সকেট এবং সম্পর্কিত সংযোগটি স্বাভাবিক ঘনিষ্ঠ পদ্ধতির মধ্য দিয়ে যায় (কার্যকরভাবে পিয়ারকে একটি এফআইএন / ইওফ প্রেরণ করে) এবং সকেটটি বিচ্ছিন্ন হয়ে যায়।

এখানে মনোযোগ দেওয়ার বিষয়টি হ'ল যদি হ্যান্ডেল গণনাটি শূন্য না পৌঁছায় কারণ অন্য কোনও প্রক্রিয়াটির সকেটে এখনও একটি হ্যান্ডেল রয়েছে তবে সংযোগটি বন্ধ হয় না এবং সকেটটি বিচ্ছিন্ন হয় না।

অন্যদিকে shutdownপড়া ও লেখার জন্য কলিং অন্তর্নিহিত সংযোগটি বন্ধ করে দেয় এবং সকেটে কতগুলি প্রক্রিয়া পরিচালনা করে তা নির্বিশেষে পিয়ারকে একটি এফআইএন / ইওএফ প্রেরণ করে। যাইহোক, এটি সকেটটি ডিঅলোকেট করে না এবং এরপরে আপনাকে আরও কাছে কল করতে হবে।


দুর্দান্ত উত্তর, আমি কখনই তা খুঁজে বের করার মাথা ঘামাইনি shutdown():)
ম্যাট জেন্ডার

2
পড়ার জন্য কোনও শাটডাউন () কি এফআইএন প্যাকেটটি প্রেরণের কারণ হতে পারে? অর্থাত্ শাটডাউন (সোক_এফডি, 1);
আর্নেস্তো

সর্বদা কল করা .shutdown()এবং পরবর্তী লাইনে স্মার্ট হবে .close()? নাকি এর মধ্যে কোনও বিলম্ব হওয়া উচিত?
লু

@ লুক আপনি যা করছেন তার উপর সম্পূর্ণ নির্ভর করে।
রবার্ট এস বার্নেস

2
@ লুক তারপর যতক্ষণ না সকেটে অন্য কোনও প্রক্রিয়াটির হ্যান্ডেল না থাকে ঠিক ততক্ষণ ঠিক আছে।
রবার্ট এস বার্নেস

17

শাটডাউন এবং বন্ধের ব্যাখ্যা: গ্রেসফুল শাটডাউন (এমএসডিএন)

শাটডাউন (আপনার ক্ষেত্রে) সংযোগের অন্য প্রান্তকে বোঝায় যে সকেট থেকে পড়া বা লেখার আর কোনও ইচ্ছা নেই। তারপরে সকেটের সাথে জড়িত যেকোন স্মৃতি বন্ধ করে দেয়।

ছাড় দেওয়া বন্ধ করার ফলে সংযোগটি সুদৃশ্যভাবে বন্ধ না হওয়া পর্যন্ত সকেটটি ওএস স্ট্যাকের মধ্যে দীর্ঘায়িত হতে পারে।

আইএমও 'শাটডাউন' এবং 'ক্লোজ' নামগুলি বিভ্রান্ত করছে, 'বন্ধ' এবং 'ধ্বংস' তাদের পার্থক্যকে জোর দেবে।


এটি অন্য প্রান্তে ইঙ্গিত দেয় না যে পড়ার আর কোনও ইচ্ছা নেই। পঠনের জন্য শাটডাউন পিয়ারকে কিছু পাঠায় না।
লার্নের মারকুইস

7

এটি সকেট প্রোগ্রামিং হাওটোতে সঠিকভাবে উল্লেখ করা হয়েছে ( পাই 2 / পাই 3 )

সংযোগ বিচ্ছিন্ন করা

কড়া কথায় বলতে গেলে, আপনার shutdownআগে সকেট ব্যবহার করার কথা closeshutdownঅন্য প্রান্তে সকেট একটি উপদেষ্টা হয়। আপনি যে তর্কটি পাস করেছেন তার উপর নির্ভর করে এর অর্থ হতে পারে " আমি আর প্রেরণ করব না, তবে আমি এখনও শুনব ", বা " আমি শুনছি না, ভাল বিড়ম্বনা! "। বেশিরভাগ সকেট লাইব্রেরি, প্রোগ্রামারদের তাই ব্যবহার করা অবহেলা করে এই শিষ্টাচারের টুকরোটি ব্যবহার করার জন্য যা সাধারণত একটির closeমতো হয় shutdown(); close()। সুতরাং বেশিরভাগ পরিস্থিতিতে একটি স্পষ্টভাবে শাটডাউন প্রয়োজন হয় না।

...


এই তথ্যটি সঠিক নয়। লেখার জন্য কোনও সকেট বন্ধ করা কেবলমাত্র প্রয়োজন যদি (1) আপনি প্রক্রিয়াটি স্বীকার করেছেন এবং অবশ্যই এখনই এফআইএন প্রেরণ করতে চান , বা (2) আপনি মিউচুয়াল রিড-টু-ইওএস প্রোটোকলে জড়িত রয়েছেন যে উভয় সমবয়সী বন্ধ হয়ে যায় একই সাথে অন্যথায় close()যথেষ্ট। পাইথন ডকুমেন্টেশন সংশোধন করা উচিত।
লার্নের মারকুইস

4

এই কোডটি কি ভুল নয়?

শাটডাউন কলের পরে সরাসরি নিকট কল কোনও কারণেই কার্নেলটিকে সমস্ত বহির্গামী বাফার বাতিল করতে পারে।

Http://blog.netherlabs.nl/articles/2009/01/18/the-ultsmate-so_linger-page-or-why-is-my-tcp-not- নির্ভরযোগ্য অনুসারে কোনও ব্যক্তিকে শাটডাউন এবং এর মধ্যে অপেক্ষা করতে হবে 0 রিটার্ন রিটার্ন না হওয়া অবধি বন্ধ করুন।


সঠিক না. সংযোগটি পুনরায় সেট করা থাকলে কর্নেলটি কেবলমাত্র বহির্গামী বাফারগুলি ত্যাগ করবে, যদি স্থানীয় অ্যাপ্লিকেশন ইতিমধ্যে উপস্থিত থাকা সমস্ত মুলতুবি ইনবাউন্ড ডেটা না পড়ে বা পিয়ার যদি SO_LINGER এর সাথে গণ্ডগোল করে থাকে তবে এটি ঘটতে পারে যা তাদের করা উচিত নয় । ঘুমানোর দরকার নেই, এমনকি বন্ধের আগে শাটডাউন কল করার দরকার নেই। এই বিষয়টি সম্পর্কে সেখানে অনেক ভুল তথ্য রয়েছে।
লার্নের মারকুইস

3

শাটডাউন এর কিছু স্বাদ রয়েছে: http://msdn.microsoft.com/en-us/library/system.net.sockets.sket.shutdown.aspx । * নিক্স একই রকম।


শাটডাউনের একটি 'গন্ধ' রয়েছে এবং এর দুটি বিকল্প রয়েছে, যা একত্রিত হতে পারে। এখানে কিছুই আসল প্রশ্নের উত্তর দেয় না।
লার্নের মারকুইস

1

শাটডাউন (1), সকেটটিকে আর কোনও ডেটা প্রেরণে বাধ্য করে

এটি ইউসফুল ইন

1- বাফার ফ্লাশিং

2- অদ্ভুত ত্রুটি সনাক্তকরণ

3- নিরাপদ প্রহরী

আমাকে আরও ব্যাখ্যা করতে দাও, আপনি যখন A থেকে B তে কোনও ডেটা প্রেরণ করেন, তখন এটি বিতে প্রেরণের গ্যারান্টিযুক্ত হয় না, এটি কেবলমাত্র ওএস বাফারকে প্রেরণ করার গ্যারান্টিযুক্ত হয়, যা এটি বি ওএস বাফারে প্রেরণ করে

সুতরাং A তে শাটডাউন (1) কল করে আপনি A এর বাফারটি ফ্লাশ করবেন এবং বাফারটি খালি না থাকলে একটি ত্রুটি উত্থাপিত হবে:: ডেটারটি এখনও পিয়ারকে প্রেরণ করা হয়নি

যাইহোক এটি অপরিশোধনযোগ্য, সুতরাং আপনি আপনার সমস্ত ডেটা পুরোপুরি প্রেরণের পরে আপনি এটি করতে পারেন এবং আপনি নিশ্চিত হতে চান যে এটি পিয়ার ওএস বাফারে কমপক্ষে


শাটডাউন ফ্লাশকে চাপ দেয় না। বাফারিং পরিস্থিতি অপরিবর্তিত। এবং যদি বাফারটি খালি না হয় তবে কোনও ত্রুটি উত্থাপিত হবে না। এফআইএনটি কেবলমাত্র মুলতুবি থাকা ডেটার পিছনে সজ্জিত। উত্তর সম্পূর্ণ ভুল।
লার্নের মারকুইস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.