سؤال

لقد رأيت مؤخرًا جزءًا من التعليمات البرمجية التي تبدو هكذا (مع كون الجورب كائنًا مأخذ التوصيل بالطبع):

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

ما هو بالضبط الغرض من استدعاء إيقاف التشغيل على المقبس ثم إغلاقه؟إذا أحدث ذلك فرقًا، فسيتم استخدام هذا المقبس للإدخال والإدخال غير المحظور.

هل كانت مفيدة؟

المحلول

وهنا واحدة <لأ href = "http://publib.boulder.ibm.com/infocenter/systems/index.jsp؟topic=/com.ibm.aix.progcomm/doc/progcomc/skt_shutdn.htm" يختلط = "noreferrer"> تفسير :

<اقتباس فقرة>   

وعندما لم يعد مطلوبا مأخذ،   برنامج الاستدعاء يمكن تجاهل   المقبس عن طريق تطبيق روتين قريب   إلى واصف مأخذ. اذا كان   يمكن الاعتماد عليها مأخذ توصيل يحتوي على بيانات   يرتبط معها عندما يأخذ قريب   مكان، يستمر النظام لمحاولة   نقل البيانات. ومع ذلك، إذا كانت البيانات   لا يزال غير المسلمة، والمرتجع النظام   البيانات. ينبغي تطبيق   برنامج لديها أي استخدام لأي المعلقة   البيانات، فإنه يمكن استخدام الاغلاق   روتين على مأخذ قبل   إغلاقه.

نصائح أخرى

الاتصال close و shutdown لهما تأثيران مختلفان على المقبس الأساسي.

أول شيء يجب الإشارة إليه هو أن المقبس هو مورد في نظام التشغيل الأساسي و يمكن أن تحتوي العمليات المتعددة على مقبض لنفس المقبس الأساسي.

عندما تتصل close إنه يقلل عدد المقابض بمقدار واحد وإذا وصل عدد المقابض إلى الصفر، فإن المقبس والاتصال المرتبط به يمر عبر إجراء الإغلاق العادي (إرسال FIN / EOF بشكل فعال إلى النظير) ويتم إلغاء تخصيص المقبس.

الشيء الذي يجب الانتباه إليه هنا هو أنه إذا لم يصل عدد المقابض إلى الصفر لأن عملية أخرى لا تزال تحتوي على مؤشر للمقبس، فسيتم الاتصال لم يتم إغلاقه ولم يتم إلغاء تخصيص المقبس.

ومن ناحية أخرى يدعو shutdown للقراءة والكتابة، يتم إغلاق الاتصال الأساسي وإرسال FIN / EOF إلى النظير بغض النظر عن عدد العمليات التي لها مقابض في المقبس.ومع ذلك، فإنه لا قم بإلغاء تخصيص المقبس وما زلت بحاجة إلى الاتصال بالإغلاق بعد ذلك.

وشرح اغلاق وثيقة: اغلاق رشيقة (MSDN)

والإغلاق (في قضيتك) يشير إلى الطرف الآخر من الاتصال ليس هناك نية مزيد من القراءة من أو الكتابة إلى مأخذ. ثم أغلق يحرر أي الذاكرة المرتبطة المقبس.

والاستغناء عن اغلاق قد يتسبب في المقبس من إغلاقه في كومة أنظمة التشغيل حتى تم إغلاق الاتصال بأمان.

وIMO أسماء "اغلاق" و "وثيقة 'مضللة،' وثيقة 'و' تدمير 'أن أؤكد خلافاتهم.

تم ذكره مباشرة في كيفية برمجة المقبس (py2/py3)

قطع الاتصال

بالمعنى الدقيق للكلمة، من المفترض أن تستخدم shutdown على المقبس أمامك close هو - هي.ال shutdown هو استشاري للمقبس في الطرف الآخر.اعتمادًا على الوسيطة التي تمررها، يمكن أن تعني "لن أرسل بعد الآن، لكني سأظل أستمع"، أو "أنا لا أستمع، بئس المصير!".ومع ذلك، فإن معظم مكتبات المقبس معتادة على إهمال المبرمجين استخدام هذه الآداب التي عادة ما تكون close بالضبط مثل shutdown(); close().لذلك، في معظم الحالات، ليس هناك حاجة إلى إيقاف التشغيل الصريح.

...

وليس هذا رمز أعلاه الخطأ؟

والدعوة وثيقة مباشرة بعد المكالمة الاغلاق قد يجعل تجاهل نواة جميع المخازن الصادرة على أي حال.

ووفقا ل <وأ href = "http://blog.netherlabs.nl/articles/2009/01/18/the-ultimate-so_linger-page-or-why-is-my-tcp-not-reliable" يختلط = "noreferrer" > http://blog.netherlabs.nl/articles/2009/01/18/the-ultimate-so_linger-page-or-why-is-my-tcp-not-reliable يحتاج المرء الى الانتظار بين الاغلاق وثيقة حتى يعود قراءة 0.

وهناك بعض النكهات من الاغلاق: http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.shutdown.aspx . * لا شىء مشابه.

Shutdown(1) ، يفرض على المقبس عدم إرسال أي بيانات أخرى

وهذا مفيد في

1- تفريغ المخزن المؤقت

2- اكتشاف خطأ غريب

3- الحراسة الآمنة

اسمحوا لي أن أشرح المزيد ، عندما ترسل بيانات من A إلى B ، لا يضمن إرسالها إلى B ، فمن الضمان فقط أن يتم إرسالها إلى المخزن المؤقت لـ A OS ، والذي يرسله بدوره إلى BOS BAUNT

لذلك عن طريق استدعاء إيقاف التشغيل (1) على A ، يمكنك تدفق المخزن المؤقت لـ A ويتم رفع خطأ إذا لم يكن المخزن المؤقت فارغًا أي:لم يتم إرسال البيانات إلى النظير حتى الآن

ومع ذلك ، لا يمكن هذا ذلك ، لذلك يمكنك القيام بذلك بعد إرسال جميع بياناتك تمامًا وتريد أن تتأكد من أنها على الأقل في Beer OS Buffer

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top