الخلاصة

  • قدمت Windows Sockets 1.1 للمبرمجين في Windows واجهة TCP/IP مستندة إلى Berkeley، لكنها لم تستطع نقل سلوك Berkeley المحجوب كما هو إلى Windows ذي 16 بت.
  • كان على استدعاء Winsock المحجوب أن يواصل توزيع رسائل Windows. أبقى ذلك سطح المكتب التعاوني مستجيبًا، لكنه فرض قيودًا صارمة على الاستدعاءات المتداخلة وإعادة الدخول وعمر المخازن المؤقتة.

كان يفترض بالمقبس أن يخفي الشبكة

يمنح المقبس البرنامج طريقة ثابتة لإرسال البيانات واستقبالها من دون ربطه بمورد مكدس الشبكة الذي يعمل في الخلفية. أراد مطورو Windows هذه الصفقة. وأرادوا نقطة انطلاق مألوفة أيضًا: كانت مقابس Berkeley قد أصبحت نموذج البرمجة القياسي لـ TCP/IP على Unix.

بدأ مشروع Windows Sockets في جلسة Birds of a Feather ضمن Interop ’91 في سان خوسيه يوم 10 أكتوبر 1991. وتسجل مواصفة 1.1 ما تلا ذلك: لجنة، ونقاشات بالبريد الإلكتروني، ومسودة استفادت كثيرًا من مقترحات JSB وNetManage، واجتماع استضافته Microsoft في ديسمبر، ثم فريق عمل واصل صياغة الوثيقة. كانت هذه واجهة صاغتها مجموعة، لا بروتوكول TCP/IP فرضه مورد واحد.

صدرت النسخة 1.0 كي يبدأ موردو برامج الشبكات ومطورو التطبيقات بناء تطبيقات وتنفيذات وفق عقد مشترك. أما النسخة 1.1، المؤرخة في 20 يناير 1993، فأضافت توضيحات وتصحيحات صغيرة استنادًا إلى خبرة الشركات التي نفذت 1.0. والترتيب مهم: اختبر الفريق النص على الشيفرة قبل أن يستقر على صياغة النسخة التالية.

اعتمدت المواصفة نموذج مقابس Berkeley ليكون مألوفًا لمبرمجي Unix ويسهّل نقل الشيفرة المصدرية. وحددت حزمة بروتوكولات الإنترنت، بمقابس تدفق TCP ومقابس مخططات بيانات UDP. ولم تدّع أن النسخة 1.1 توحّد كل شبكة ممكنة. كان هذا حدًا مفيدًا: حصل مطورو التطبيقات على واجهة يعرفونها، من دون وعد بأن كل نظام تحتها سيتصرف بالطريقة نفسها.

ثم التقى recv بسطح مكتب ذي 16 بت

تظهر الصعوبة عندما ينتظر البرنامج. لا يعود استدعاء recv المحجوب قبل وصول البيانات أو حسم العملية بطريقة أخرى. في نظام ذي جدولة استباقية، يستطيع نظام التشغيل جدولة أعمال أخرى بينما ينتظر ذلك الإجراء. ولم يكن بوسع Windows Sockets 1.1 افتراض وجود هذه الجدولة في Windows ذي 16 بت.

تشرح وثائق Microsoft المعالجة بتفصيل لافت. إذا تعذر إكمال عملية محجوبة فورًا، يبدأ مزود الخدمة العملية ويدخل حلقة: يوزع رسائل Windows، ويتحقق مما إذا كان استدعاء المقبس قد اكتمل، ثم يكرر ذلك. وهكذا يواصل التطبيق القائم على الرسائل معالجة أحداث نوافذه بينما تظل قراءة الشبكة معلقة.

لم يحول هذا التصميم برنامجًا ذا 16 بت إلى عملية ذات جدولة استباقية. بل أدخل توزيع رسائل Windows داخل استدعاء قد يعدّه المبرمج مجرد انتظار. وقد تدفع رسالة تصل أثناء الانتظار التطبيق إلى إجراء استدعاء Winsock آخر. منعت النسخة 1.1 هذا التداخل: لا يجوز للمهمة أن تملك إلا استدعاء دالة Winsock واحدًا قيد التنفيذ. ويفشل الاستدعاء المتداخل الثاني بالخطأ WSAEINPROGRESS.

قدمت الواجهة مخرجين صغيرين. يتيح WSAIsBlocking للتطبيق معرفة ما إذا كان استدعاء محجوب جارٍ، ويستطيع WSACancelBlockingCall إلغاءه. أما التطبيقات الأكثر تعقيدًا، ومنها التي تستخدم نوافذ مستندات متعددة، فيمكنها تثبيت WSASetBlockingHook واستبدال روتين توزيع الرسائل الافتراضي. يكسب التطبيق التحكم، ويتحمل معه مسؤولية معالجة الرسائل على نحو صحيح.

نقلت الواجهة العمل؛ ولم تمحه

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

هذه هي الفجوة الصغيرة والحاسمة بين واجهة مألوفة وبرنامج قابل للنقل. قد تخفض أسماء الدوال المتطابقة تكلفة بدء النقل، لكنها لا تمحو نموذج الجدولة في النظام المضيف أو حلقة رسائله أو عمر الذاكرة. وسجلت Microsoft لاحقًا ملفات الترويسة التي تساعد على نقل شيفرة BSD، كما أبقت تصريحات Winsock.h القديمة لضمان توافق التطبيقات السابقة بعد أن قدم Winsock 2 ملف Winsock2.h. صار التوافق نفسه برنامجًا يجب الاحتفاظ به.

رسمت النسخة 1.1 حدها عند الواجهة وأنواع مقابس TCP/IP التي تدعمها. وفر الموردون التنفيذات؛ واختار مطورو التطبيقات طريقة الانتظار والإلغاء وتوزيع الرسائل وحماية الذاكرة. سهلت المواصفة المشتركة وصل هذه القطع، لكنها لم تجعل مسؤولياتها قابلة للاستبدال.

لم يكن القرار الهندسي اللافت أن Windows نسخت Berkeley. بل إن فريق العمل احتفظ بما يكفي من مفردات Berkeley لجعل النقل جذابًا، ثم وثق المواضع التي لم تستطع فيها Windows التظاهر بأنها Unix. كانت حلقة الرسائل هي الفاتورة: خفضت الواجهة المفتوحة تكلفة، وأظهرت بدقة أين ظهرت التكلفة التالية.

المصادر