Probe

اتّصال UDP: خادم وعميل

الشبكات 1يوم السبتالجلسة 4

استخدم الأسهم أو اسحب للتنقّل

مقدّمة

بلا اتّصال: UDP

في جلسة TCP كان العميل يتّصل أوّلاً ثمّ يرسل. في UDP لا اتّصال ولا مصافحة: العميل يرمي رسالة (datagram) نحو عنوان الخادم ومنفذه، والخادم يردّ على العنوان الذي جاءت منه.

برنامج اليوم خادم يفهم أوامر (hello وtime وdate وhelp…) وعميل محادثة يكتب حتّى exit. وسنرى ماذا يحدث حين لا يصل الردّ.

إضافة: المقارنة

دوالّ أقلّ، وضمان أقلّ

TCPUDP
النوعSOCK_STREAMSOCK_DGRAM
اتّصال قبل الإرسالنعم (مصافحة)لا
الإرسال والاستلامsend / recvsendto / recvfrom
وصول البيانات وترتيبهامضمونغير مضمون
الحدود بين الرسائللا (تيّار)نعم (كلّ datagram رسالة)
الخادم
  1. socket(SOCK_DGRAM)
  2. bind()
  3. recvfrom() / sendto()
العميل
  1. socket(SOCK_DGRAM)
  2. sendto() / recvfrom()
  3. close()

UDP: لا اتّصال ولا مصافحة. كلّ رسالة datagram مستقلّة تحمل عنوانها، وقد تضيع بلا إخبار.

server.py

الخادم: bind ← recvfrom ← sendto

يربط نفسه بـ 127.0.0.1:9999 ثمّ يدور في حلقة: يستلم رسالة ومعها عنوان مرسلها، يختار الردّ حسب الأمر، ويرسله إلى العنوان نفسه.

الكود معروض مختصراً: فروع date وname وbye وhelp بالنمط نفسه، والمحاكي في السلايد القادم ينفّذها كلّها.
server.pyاضغط على سطر
السطر 4 SOCK_DGRAM يعني UDP: رسائل مستقلّة بلا اتّصال.
client.py

العميل: حلقة محادثة

يقرأ رسالة، يخرج إن كانت exit، وإلّا يرسلها وينتظر الردّ خمس ثوانٍ على الأكثر.

لا connect هنا: عنوان الخادم يُكتب مع كلّ sendto.
client.pyاضغط على سطر
السطر 4 socket من نوع UDP، بلا bind: النظام يعطيه منفذاً عند أوّل sendto.
المحاكي

أرسل أوامر، ثمّ أطفئ الخادم

server.pyيعمل على 9999
[*] السيرفر يعمل على 127.0.0.1:9999
[*] في انتظار الرسائل...
على الشبكة
    client.pyجاهز · :51544
    اكتب رسالة أو اضغط أمراً فوق

    جرّب: أرسل والخادم مطفأ، ثمّ فعّل «شبكة سيّئة». في UDP لا خطأ عند الإرسال؛ تعرف فقط أنّ الردّ لم يصل حين تنتهي المهلة (5 ثوانٍ في الكود، وثانيتان هنا).

    إضافة: ما تلاحظه حين تشغّله

    أشياء ستصادفها في المخبر

    • يمكنك تشغيل العميل قبل الخادم بلا خطأ (بخلاف TCP): الرسالة تضيع، وتنتهي المهلة.
    • شغّل أكثر من عميل معاً: الخادم يردّ على كلّ واحد، لأنّه لا يرتبط بعميل؛ كلّ رسالة تحمل عنوان صاحبها.
    • bye لا يُطفئ الخادم: هو ردّ نصّيّ فقط. الخادم يتوقّف بـ Ctrl + C.
    • الرسائل العربيّة تعمل لأنّ الطرفين يستعملان utf-8 في encode وdecode. لو اختلف الترميز لظهرت رموز غريبة.
    • settimeout(5) داخل الحلقة يكفي مرّة واحدة قبلها، ووضعه داخلها لا يضرّ.
    اختبار الجلسة