বন্ধ বনাম সকেট বন্ধ?


214

সি তে, আমি বুঝতে পেরেছিলাম যে আমরা যদি সকেটটি বন্ধ করি তবে এর অর্থ সকেটটি নষ্ট হয়ে যাবে এবং পরে আবার ব্যবহার করা যাবে।

শাটডাউন কেমন হবে? বিবরণে বলা হয়েছে এটি সকেটের সাথে দ্বৈত সংযোগের অর্ধেকটি বন্ধ করে দেয়। কিন্তু সেই সকেটটি কি closeসিস্টেম কলের মতো ধ্বংস হয়ে যাবে ?


এটি পরে পুনরায় ব্যবহার করা যাবে না। এটা বন্ধ. সম্পন্ন হয়েছে। সম্পন্ন.
লার্নের মারকুইস

উত্তর:


191

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

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


23
মনে রাখবেন, আপনি যদি কোনও টিসিপি সকেট বন্ধ করেন (এমনকি) এটি অবশ্যই তাত্ক্ষণিকভাবে পুনরায় ব্যবহারযোগ্য হবে না, কারণ এটি কোনও টিআইএমE_ওয়াইআইটি অবস্থায় থাকবে যখন ওএস নিশ্চিত করে যে কোনও অসামান্য প্যাকেট নেই যা নতুন তথ্য হিসাবে বিভ্রান্ত হতে পারে তাৎক্ষণিকভাবে অন্য কোনও কিছুর জন্য সেই সকেটটি পুনরায় ব্যবহার করা উচিত।
alesplin

91
সকেট অন্যান্য প্রক্রিয়া দ্বারা ভাগ করা হয় যখন সকেট বন্ধ এবং সকেট বন্ধ মধ্যে বড় পার্থক্য হয় আচরণ। একটি শাটডাউন () সকেটের সমস্ত অনুলিপিগুলিকে প্রভাবিত করে যখন ক্লোজ () কেবল একটি প্রক্রিয়াতে কেবল ফাইল বর্ণনাকারীকে প্রভাবিত করে।
Zan Lynx

5
আপনি shutdownউভয় দিকনির্দেশ ব্যবহার করতে চাইতে পারেন এর একটি কারণ আপনি closeযদি FILEসকেটের সাহায্যে কোনও রেফারেন্স তৈরি করেন তবে তা নয় fdopen। আপনি যদি closeসকেট, একটি নতুন খোলা ফাইল একই এফডি নির্ধারিত হতে পারে, এবং এর পরের ব্যবহার FILEভুল জায়গা পড়তে / লিখতে হবে যা খুব খারাপ হতে পারে। আপনি যদি ঠিক থাকেন তবে shutdownপরবর্তী উইলের ব্যবহার FILEনা fcloseকরা পর্যন্ত ত্রুটি ঘটবে ।
আর .. গীটহাব বন্ধ করুন ICE

25
TIME_WAIT সম্পর্কে মন্তব্যটি ভুল। এটি সকেটে নয়, বন্দরগুলিতে প্রযোজ্য। আপনি সকেট পুনরায় ব্যবহার করতে পারবেন না।
লার্নের মারকুইস

48
-1। এই পোস্টটি এবং লিঙ্কটি উভয়ই ব্যবহার করতে চান এমন একটি গুরুত্বপূর্ণ ধারণাগত কারণ বাদ দেয় shutdown: পিয়ারের কাছে ইওএফকে সিগন্যাল করতে এবং এখনও পীরের প্রেরিত মুলতুবি থাকা ডেটা পেতে সক্ষম হবেন।
জোয়ে অ্যাডামস

144

টিসিপি প্রোটোকল স্তরে কীভাবে shutdownএবং কীভাবে closeকাজ করে তা বিদ্যমান উত্তরগুলির কোনওটিই লোকেরা জানায় না, তাই এটি যুক্ত করা ভাল।

4-চূড়ান্ত চূড়ান্তকরণের মাধ্যমে একটি স্ট্যান্ডার্ড টিসিপি সংযোগটি বন্ধ হয়ে যায়:

  1. একবার কোনও অংশগ্রহণকারীর কাছে পাঠানোর মতো আরও কোনও ডেটা না থাকলে, এটি অন্যটিতে একটি এফআইএন প্যাকেট প্রেরণ করে
  2. অন্য পক্ষটি এফআইএন-এর জন্য একটি এসকে প্রদান করে।
  3. অন্য পক্ষ যখন ডেটা স্থানান্তর শেষ করে, এটি অন্য একটি এফআইএন প্যাকেট প্রেরণ করে
  4. প্রাথমিক অংশগ্রহণকারী একটি এসকে প্রদান করে এবং স্থানান্তর চূড়ান্ত করে।

তবে, টিসিপি সংযোগ বন্ধ করার জন্য আরও একটি "উদীয়মান" উপায় রয়েছে:

  1. একজন অংশগ্রহণকারী একটি আরএসটি প্যাকেট প্রেরণ করে এবং সংযোগটি ত্যাগ করে
  2. অন্য পক্ষটি একটি আরএসটি পায় এবং তারপরে সংযোগটি ত্যাগ করে

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

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

বিধি সম্পর্কে আমার মতামত হবে:

  1. সম্ভব হলে shutdownআগে বিবেচনা করুনclose
  2. আপনি শাটডাউন করার সিদ্ধান্ত নেওয়ার আগে যদি আপনি (০ আকারের ডেটা প্রাপ্ত হওয়া) পাওয়া শেষ করেন তবে শেষ প্রেরণের (যদি থাকে) শেষ হওয়ার পরে সংযোগটি বন্ধ করুন।
  3. আপনি যদি সংযোগটি স্বাভাবিকভাবে বন্ধ করতে চান তবে সংযোগটি বন্ধ করুন (SHUT_WR এর সাথে, এবং যদি আপনি এই পয়েন্টের পরেও SHUT_RD এর সাথে ডেটা গ্রহণের বিষয়ে চিন্তা না করেন) এবং আপনি যদি 0 আকারের ডেটা না পান ততক্ষণ অপেক্ষা করুন এবং তারপরে বন্ধ করুন সকেট.
  4. যাইহোক, অন্য কোনও ত্রুটি ঘটলে (উদাহরণস্বরূপ সময়সীমা), কেবল সকেটটি বন্ধ করুন।

SHUT_RD এবং SHUT_WR এর জন্য আদর্শ বাস্তবায়ন

নিম্নলিখিতগুলি পরীক্ষা করা হয়নি, নিজের ঝুঁকিতে বিশ্বাস করুন। তবে আমি বিশ্বাস করি এটি কাজ করার একটি যুক্তিসঙ্গত এবং ব্যবহারিক উপায়।

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

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


2
"যদি আপনি সংযোগটি এখনও জীবিত থাকেন তবেই যদি আপনি নিকটকে ফোন করেন তবে" তাৎপর্যসূচক এবং এটি কোনও আরএসটি প্রেরণের কারণ হয় না। (1) প্রয়োজনীয় নয়। (4) এ টাইমআউটগুলি সংযোগের জন্য অগত্যা মারাত্মক নয় এবং অদৃশ্য ইঙ্গিত দেয় না যে আপনি এটি বন্ধ করতে পারেন।
লার্নের মারকুইস

4
@ এজেপি না, এটি টোটোলজিকাল নয়। আপনি shutdown()সংযোগ করতে পারেন এবং তারপরে এটি আর বেঁচে নেই। আপনার কাছে এখনও ফাইল বর্ণনাকারী রয়েছে। আপনি এখনও recv()গ্রহণ বাফার থেকে করতে পারেন । এবং আপনার এখনও close()ফাইল বর্ণনাকারী নিষ্পত্তি করার জন্য কল করতে হবে।
পাভেল Šিমেরদা

এটি তারের ফর্ম্যাট সংক্রান্ত সেরা উত্তর। আমি SHUT_RD- এর সাথে বন্ধ করার বিষয়ে আরও বিশদ সম্পর্কে আগ্রহী be আরও ডেটা আশা না করার জন্য কোনও টিসিপি সংকেত নেই, তাই না? আরও ডেটা না প্রেরণের জন্য কি কেবল এফআইএন নেই?
পাভেল Šিমেরদা

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

1
@ ইজেপি আপনার কি আসলে কোন যুক্তি আছে? নইলে আমি আগ্রহী নই।
পাভেল Šিমেরদা

35

এর সাথে কিছু সীমাবদ্ধতা close()এড়ানো যায় যদি এর shutdown()পরিবর্তে কেউ ব্যবহার করে।

close()টিসিপি সংযোগের উভয় দিকই শেষ করে দেবে। কখনও কখনও আপনি অন্য প্রান্তটি বলতে চান যে আপনি ডেটা প্রেরণে শেষ করেছেন তবে এখনও ডেটা গ্রহণ করতে চান।

close() হ্রাসকারী বর্ণনাকারীদের রেফারেন্স গণনা (ফাইল টেবিল এন্ট্রিতে রক্ষণাবেক্ষণ করা এবং বর্তমানে ফাইলগুলি / সকেটের উল্লেখ করা সংখ্যক বর্ণনাকারীর সংখ্যা গণনা করে) এবং বর্ণনাকারী 0 না থাকলে সকেট / ফাইলটি বন্ধ করে না এটির অর্থ হ'ল আপনি কাঁটাচামচ করছেন, ক্লিনআপটি কেবল রেফারেন্স গণনা 0 এ নেমে যাওয়ার পরে ঘটে With shutdown() এক স্বাভাবিক বিভিন্ন TCP ঘনিষ্ঠ ক্রম রেফারেন্স গণনা উপেক্ষা সূচনা করতে পারেন।

প্যারামিটারগুলি নিম্নরূপ:

int shutdown(int s, int how); // s is socket descriptor

int how হতে পারে:

SHUT_RDবা 0 আরও প্রাপ্তিগুলি অনুমোদিত নয়

SHUT_WRবা 1 আরও প্রেরণগুলি অনুমোদিত নয়

SHUT_RDWRবা এর পরে 2 প্রেরণ এবং প্রাপ্তিগুলি অনুমোদিত নয়


8
দুটি ফাংশন সম্পূর্ণ ভিন্ন উদ্দেশ্যে হয়। সকেটের চূড়ান্ত কাছেরটি শটডাউন ক্রমটি সূচনা করে যদি কেউ ইতিমধ্যে শুরু না করে থাকে তবে সকেট ডেটা স্ট্রাকচারগুলি পরিষ্কার করার জন্য বন্ধ হওয়াটি টিসিপি স্তর স্তরের শাটডাউন ক্রম শুরু করার জন্য এটি পরিবর্তন করে না।
লেন হলগেট

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

15

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

সংক্ষেপে, টিসিপি স্তরে শাটডাউন সিকোয়েন্স পাঠাতে শাটডাউনটি ব্যবহার করুন এবং আপনার প্রক্রিয়াতে সকেট ডেটা স্ট্রাকচার দ্বারা ব্যবহৃত সংস্থানগুলি মুক্ত করতে ক্লোজ ব্যবহার করুন। আপনি যখন কাছে কল করবেন তখন আপনি যদি স্পষ্টভাবে শাটডাউন ক্রম জারি না করেন তবে আপনার জন্য একটি সূচনা করা হবে।


9

আমি লিনাক্সের অধীনে সাফল্য shutdown()পেয়েছি একটি প্রথড থেকে ব্যবহার করে বর্তমানে অন্য প্রাইথ্রেডকে connect()তাড়াতাড়ি বাতিল করতে বাধ্য করা হয়েছে ।

অন্যান্য ওএসের (কমপক্ষে ওএসএক্স) এর অধীনে, আমি দেখেছি কল ব্যর্থ close()হওয়ার জন্য যথেষ্ট ছিল connect()


7

"শাটডাউন () আসলে ফাইল বর্ণনাকারীটিকে বন্ধ করে না — এটি কেবল তার ব্যবহারযোগ্যতা পরিবর্তন করে a 1


3

ঘনিষ্ঠ

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

শাটডাউন

আপনি শাটডাউন কল করে কোনও সংযোগে কেবল অভ্যর্থনা বা সংক্রমণ বন্ধ করতে পারেন।

শাটডাউন ফাংশন সকেটের সংযোগ বন্ধ করে দেয়। এর তর্কটি কী কী কার্য সম্পাদন করবে তা নির্দিষ্ট করে: 0 এই সকেটের ডেটা প্রাপ্তি বন্ধ করুন। যদি আরও ডেটা আসে তবে তা প্রত্যাখ্যান করুন। 1 এই সকেট থেকে ডেটা সংক্রমণ করার চেষ্টা বন্ধ করুন। প্রেরণের অপেক্ষায় থাকা কোনও ডেটা বাতিল করুন। ইতিমধ্যে প্রেরিত ডেটার স্বীকৃতি অনুসন্ধান বন্ধ করুন; এটি হারিয়ে গেলে এটি পুনরুদ্ধার করবেন না। 2 অভ্যর্থনা এবং সংক্রমণ উভয়ই বন্ধ করুন।

প্রত্যাবর্তনের মান সাফল্যের সাথে 0 এবং ব্যর্থতায় -1 হয়।


2

আমার পরীক্ষায়

close সকেট অন্যান্য প্রক্রিয়াগুলির সাথে ভাগ না করা হলে ফিন প্যাকেট প্রেরণ করবে এবং অবিলম্বে এফডি নষ্ট করবে

shutdown SHUT_RD , প্রক্রিয়াটি এখনও সকেট থেকে ডেটা পুনরুদ্ধার করতে পারে, তবে recvটিসিপি বাফার খালি থাকলে 0 ফিরে আসবে pe পিয়ারের পরে আরও ডেটা প্রেরণের পরে recvআবার ডেটা ফেরত আসবে।

shutdown SHUT_WR ফিনের প্যাকেট প্রেরণ করবে যাতে প্রেরিত প্রেরণগুলি মঞ্জুরিপ্রাপ্ত নয় indicate পিয়ার ডেটা পুনরুদ্ধার করতে পারে তবে এটির টিসিপি বাফার খালি থাকলে 0 টি পুনরুদ্ধার করে

shutdown পিয়ার যদি আরও ডেটা প্রেরণ করে তবে SHUT_RDWR ( SHUT_RD এবং SHUT_WR উভয়ই ব্যবহারের সমতুল্য ) প্রথম প্যাকেট প্রেরণ করবে।


আমি কেবল এটি চেষ্টা করে close()FIN এর পরিবর্তে লিনাক্সে আরএসটি প্রেরণ করেছি।
পাভেল Šিমেরদা

এছাড়াও আপনি কি সত্যিই বলতে চেয়েছিলেন যে পড়ার দিকটি বন্ধ করার পরে, প্রোগ্রামটি আরও ডেটা পাবে?
পাভেল Šিমেরদা

@ পাভেলিমারদা আমার মনে হয় এটি আরএসটি বা এফআইএন প্রেরণের জন্য টিসিপি রাজ্যের উপর নির্ভর করবে? আমি নিশ্চিত নই.
সিমপ্লেক্স

১. 'পিয়ার আরও ডেটা প্রেরণের পরে recv()আবার ডেটা ফেরত দেবে' সঠিক নয়। ২. পিয়ার SHUT_RDযদি প্ল্যাটফর্ম নির্ভর হয় তার পরে আরও ডেটা প্রেরণ করে তবে তার আচরণ ।
লার্নের মারকুইস

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