UDP/مقابس مخطط البيانات في Node.js

من موسوعة حسوب

مؤشر الاستقرار: 2 - مستقر.

توفر وحدة dgram تطبيق مقابس مخطط البيانات UDP.

const dgram = require('dgram');
const server = dgram.createSocket('udp4');

server.on('error', (err) => {
  console.log(`server error:\n${err.stack}`);
  server.close();
});

server.on('message', (msg, rinfo) => {
  console.log(`server got: ${msg} from ${rinfo.address}:${rinfo.port}`);
});

server.on('listening', () => {
  const address = server.address();
  console.log(`server listening ${address.address}:${address.port}`);
});

server.bind(41234);
// الخادم يستمع 0.0.0.0:41234

الصنف: dgram.Socket

أُضيف مع الإصدار: v0.1.99.

كائن dgram.Socket هو EventEmitter يغلف وظيفة مخطط البيانات.

وتُنشأ حالات جديدة من dgram.Socket باستخدام التابع dgram.createSocket()‎. ولا يمكن استخدام الكلمات الرئيسية الجديدة new لإنشاء مثيلات dgram.Socket.

الحدث: 'close'

أُضيف مع الإصدار: v0.1.99.

ينطلق الحدث 'close' بعد إغلاق المقبس باستخدام التابع close()‎. تو انطلاقه، لن تنطلق أي أحداث 'message' جديدة علي هذا المقبس.

الحدث: 'error'

أُضيف مع الإصدار: v0.1.99.

exception من النوع <Error>.

ينطلق الحدث 'error' عند حدوث أي خطأ. ويمرر كائن Error لدالة معالج الأحداث منفردًا.

الحدث: 'listening'

أُضيف مع الإصدار: v0.1.99.

ينطلق حدث الاستماع 'listening' كلما بدأ مقبس في الاستماع لرسائل مخطط بيانات. يحدث هذا بمجرد إنشاء مقبس UDP.

الحدث: 'message'

أُضيف مع الإصدار: v0.1.99.

ينطلق الحدث 'message' عند توفر مخطط بيانات جديد علي المقبس. تُمرَر دالة معالج الأحداث الوسيطين: msg و rinfo.

  • msg من النوع <Buffer> وهي الرسالة.
  • rinfo من النوع <Object> وهي معلومات عن العنوان البعيد.
    • address من النوع <string> وهو عنوان الراسل.
    • family من النوع <string> وهو يحدد عائلة العنوان ('IPv4' أو 'IPv6').
    • port من النوع <number> وهو رقم منفذ الراسل.
    • size من النوع <number> وهو حجم الرسالة.

socket.addMembership(multicastAddress[, multicastInterface])‎

أضيف مع الإصدار: v0.6.9.

multicastAddress من النوع <string>.

multicastInterface من النوع<string>.

يجعل النواة (kernel) تنضم إلى مجموعة متعددة البث (multicast) عند multicastAddress و multicastInterface المُحدَدَين باستخدام خيار المقبس IP_ADD_MEMBERSHIP. إذا لم يحدد الوسيط themulticastInterface سيختار نظام التشغيل أحد واجهات الاتصال ويضيف لها العضوية. لإضافة العضوية لكل واجهة اتصال متاحة، يُستدعى addMembership عدة مرات، مرة لكل واجهة.

socket.address()‎

أُضيفت مع الإصدار: v0.1.99.

القيمة المُعادة: من النوع <Object>.

يُعيد كائن يحتوي على معلومات عن العنوان للمقبس. بالنسبة لمقبس UDP، سيحتوي هذا الكائن علي خصائص address و family و port.

socket.bind([port][, address][, callback])‎

أُضيفت مع الإصدار: v0.1.99.

port من النوع <integer>.

address من النوع <string>.

callback من النوع <Function> بدون معاملات. يُستدعى عند اكتمال الربط.

تتسبب، في حالة مقابس UDP، في استماع dgram.Socket لرسائل مخطط البيانات على port مُسمَى و address اختياري. إذا لم يُحدد port أو كان 0، سيحاول نظام التشغيل الربط على منفذ عشوائي. إذا لم يُحدد address سيحاول نظام التشغيل الاستماع على كل العناوين. بمجرد اكتمال الربط، ينطلق حدث 'listening' وتستدعى دالة callback الاختيارية.

علما بأن تحديد كلًا من مستمع حدث 'listening' وتمرير دالة callback للتابع socket.bind()‎ ليس ضارًا ولكنه ليس مفيدًا جدًا.

يحتفظ مقبس مخطط البيانات المرتبط بعمليات Node.js قيد التشغيل لتلقي رسائل مخططات البيانات.

إذا فشل الربط، ينطلق الحدث 'error'. وقد ينطلق Error في حالة نادرة (مثل محاولة الربط مع مقبس مغلق).

مثال علي خادم UDP يستمع علي المنفذ 41234:

const dgram = require('dgram');
const server = dgram.createSocket('udp4');

server.on('error', (err) => {
  console.log(`server error:\n${err.stack}`);
  server.close();
});

server.on('message', (msg, rinfo) => {
  console.log(`server got: ${msg} from ${rinfo.address}:${rinfo.port}`);
});

server.on('listening', () => {
  const address = server.address();
  console.log(`server listening ${address.address}:${address.port}`);
});

server.bind(41234);
// ألخادم يستمع 0.0.0.0:41234

socket.bind(options[, callback])‎

أُضيف مع الإصدار: 0.11.14.

  • options من النوع <Object> ويجب إدخالها. يدعم الخصائص التالية:
  • callback من النوع <Function>.

يتسبب، في حالة مقابس UDP، في استماع dgram.Socket لرسائل مخطط البيانات على port مُسمَى و address اختياري والتي تُمرر كخصائص لكائن options مُمرر كوسيط أول. إذا لم يُحدد port أو كان 0، سيحاول نظام التشغيل الربط على منفذ عشوائي. إذا لم يُحدد address سيحاول نظام التشغيل الاستماع على كل العناوين. وبمجرد اكتمال الربط، ينطلق الحدث 'listening' وتستدعى دالة callback الاختيارية.

علمًا بأن تحديد كلًا من مستمع الحدث 'listening' وتمرير دالة callback للتابع socket.bind()‎ ليس ضارًا ولكنه ليس مفيدًا جدًا.

وقد يحتوي كائن options على خاصية exclusive إضافية والتي تستخدم عند استخدام كائنات dgram.Socket مع وحدة cluster. إذا كانت قيمة exclusive هي false (افتراضيًا)، ستستخدم مشغلات العنقود نفس المعالج الأساسي سامحًا بمشاركة مهام مناولة الاتصال. أما إذا كانت قيمة ^ هي true، فلا تُشارَك المُعالج، وتؤدي محاولة مشاركة المنفذ إلى خطأ.

يحتفظ مقبس مخطط البيانات المرتبط بعمليات Node.js قيد التشغيل لتلقي رسائل مخططات البيانات.

إذا فشل الربط، ينطلق حدث 'error'. وقد ينطلق Error في حالة نادرة (مثل محاولة الربط مع مقبس مغلق).

فيما يلي مثال على استماع المقبس إلى منفذ حصري exclusive.

socket.bind({
  address: 'localhost',
  port: 8000,
  exclusive: true
});

socket.close([callback])‎

أُضيف مع الإصدار: v0.1.99.

callback من النوع <Function> وتستدعى عند إغلاق المقبس.

إغلاق المقبس الأساسي والتوقف عن الاستماع للبيانات عليه. إذا توفرت دالة رد اتصال، تُضاف كمستمع للحدث 'close'.

socket.dropMembership(multicastAddress[, multicastInterface])‎

أضيف مع الإصدار: v0.6.9.

multicastAddress من النوع <string>.

multicastInterface من النوع <string>.

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

إذا لم يُحدد multicastInterface، سيحاول نظام التشغيل إسقاط العضوية عن كافة واجهات الاتصال الصالحة.

socket.getRecvBufferSize()‎

أُضيف مع الإصدار: v8.7.0.

القيمة المُعادة: من النوع <number> حجم مخزن استقبال المقبس المؤقت SO_RCVBUF بالبايت.

socket.getSendBufferSize()‎

أُضيف مع الإصدار: v8.7.0.

القيمة المُعادة: من النوع <number> حجم مخزن إرسال المقبس المؤقت SO_SNDBUF بالبايت.

socket.ref()‎

أُضيف مع الإصدار: v0.9.1.

بشكل افتراضي، سيؤدي ربط مقبس إلى حظر عملية Node.js من الإنهاء طالما كان المقبس مفتوحًا. يمكن استخدام التابع socket.unref()‎ لاستثناء المقبس من حساب المرجع الذي يحتفظ بعملية Node.js نشطة. يُعيد التابع socket.ref()‎ إضافة المقبس إلى حساب المرجع ويستعيد السلوك الافتراضي.

لا يوجد أي تأثير إضافي لاستدعاء socket.ref()‎ عدة مرات.

يُعيد التابع socket.ref()‎ مرجع إلى المقبس بحيث يمكن تسلسل الاتصالات.

socket.send(msg[, offset, length], port[, address][, callback])‎

msg من النوع ‎<Buffer> | <Uint8Array> | <string> | <Array> وهي الرسالة المراد إرسالها.

offset من النوع <integer> وهي الإزاحة في المخزن المؤقت حيث تبدأ الرسالة.

length من النوع <integer> عدد وحدات البايت في الرسالة.

port من النوع <integer> وهو منفذ الوِجهَّة.

address من النوع <string> اسم المضيف أو عنوان IP الوِجهَّة.

callback من النوع <Function> وتُستدعى عند إرسال الرسالة.

يبث مخطط البيانات علي المقبس. ويجب تحديد port و address الوجهة.

يحتوي الوسيط msg علي الرسالة المراد إرسالها. ويمكن تطبيق سلوك مختلف اعتمادًا علي نوع الرسالة. إذا كانت msg من النوع Buffer أو Uint8Array، يحدد كلٌ من offset و length الإزاحة داخل Buffer من حيث تبدأ الرسالة وعدد البايتات في الرسالة، علي التوالي. إذا كانت msg من النوع String، ستتحول تلقائيًا إلى Buffer مع الترميز 'utf8'. مع الرسائل التي تحتوي على أحرف متعددة البايت، يحتسب كلًا من offset و length بالنسبة لطول البايت وليس موضع الحرف. أمَّا إذا كانت msg مصفوفة، يجب عدم تحديد offset و length.

ويكون وسيط address عبارة عن سلسلة. إذا كانت قيمة address هي اسم المضيف، يستخدم DNS لحل عنوان المضيف. إذا لم يُعطى address أو كان غير صحيح، يستخدم '127.0.0.1' (لمقابس udp4) أو ‎'::1'‎ (لمقابس udp6) بشكل افتراضي.

إذا لم يُربط المقبس مسبقا مع استدعاء bind، يتعيَّن للمقبس رقم منفذ عشوائي ويرتبط بعنوان "كافة الواجهات" ('0.0.0.0' لمقابس udp4، و ‎'::0'‎ لمقابس udp6).

قد تُحدَّد دالة callback اختيارية كطريقة للإبلاغ عن أخطاء DNS أو لتحديد متى تكون إعادة استخدام الكائن buf آمنة. علمًا بأن عمليات بحث DNS تأخر الوقت للإرسال بمقدار دورة واحدة على الأقل من حلقة حدث Node.js.

الطريقة الوحيدة للتأكد من أن مخطط البيانات قد أُرسِل هي باستخدام callback. إذا حدث خطأ وتوفر callback، سيمرر الخطأ كوسيط أول إلى callback. أمَّا إذا لم تتوفر callback، ينطلق الخطأ كحدث 'error' علي الكائن socket.

ويُعد كلٌ من الإزاحة والطول اختيارييَن ولكن يجب تعيين كلًا منهما إذا اُستخدِم أحدهما. وهي مدعومة فقط عندما يكون الوسيط الأول Buffer أو Uint8Array.

مثال علي إرسال حزمة UDP إلى منفذ علي localhost؛

const dgram = require('dgram');
const message = Buffer.from('Some bytes');
const client = dgram.createSocket('udp4');
client.send(message, 41234, 'localhost', (err) => {
  client.close();
});

مثال عن إرسال حزمه UDP تتألف من مخازن مؤقتة متعددة إلى منفذ علي 127.0.0.1؛

const dgram = require('dgram');
const buf1 = Buffer.from('Some ');
const buf2 = Buffer.from('bytes');
const client = dgram.createSocket('udp4');
client.send([buf1, buf2], 41234, (err) => {
  client.close();
});

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

ملاحظة حول حجم مخطط بيانات UDP

  • يعتمد الحجم الأقصى لمخطط بيانات IPv4/v6 علي MTU (وحدة الإرسال القصوى أو Maximum Transmission Unit) وعلي حجم حقل طول الحمل Payload Length.
  •  الحقل Payload Length عرضه 16 بت، مما يعني أن الحمولة العادية تتجاوز 64 كيلو أوكتيه بما في ذلك ترويسة الإنترنت والبيانات (65,507 بايت = 65,535 − 8 بايت ترويسة UDP - و 20 بايت ترويسة IP)؛ وهذا صحيح بشكل عام لواجهات الاسترجاع، ولكن رسائل مخططات البيانات الطويلة هذه غير عملية بالنسبة لمعظم المَضيفين والشبكات.
  •  وتُعد MTU هي أكبر حجم يمكن أن تدعمه تقنية طبقة الوصل (link layer) المعطاة لرسائل مخطط البيانات. ولأي وصلة، تُفوِّض IPv4 حد أدنى من MTU قدره 68 أوكتيه، في حين أن MTU الموصى بها لـ IPv4 هو 576 (عادة يوصى بها كـ MTU للتطبيقات من النوع الهاتفي)، سواء تصل كاملة أو مجزأة.
  • بالنسبة إلى IPv6، تكون أدنى MTU مقدرُها 1280 أوكتيه، ومع ذلك، فإن الحد الأدنى الإلزامي لحجم المخزن المؤقت لتجميع الأجزاء هو 1500 أوكتيه. قيمة 68 أوكتيه صغيرة جدًا، إذ يكون الحد الأدنى لـ MTU في معظم تقنيات طبقة الوصل الحالية، مثل إيثرنت، هو 1500.
  • ومن المستحيل أن تعرف مقدمًا حجم MTU لكل وصلة تمر من خلالها الحزمة. ولن يعمل إرسال مخطط بيانات أكبر من MTU المُتلقِي، لأن الحزمة سوف تُسقَط دون إبلاغ المُصدِر بأن البيانات لم تصل إلى المتلقي المقصود.

socket.setBroadcast(flag)‎

أضيف مع الإصدار: v0.6.9.

flag من النوع <boolean>.

ضبط أو مسح خيار المقبس SO_BROADCAST. عند ضبطه بالقيمة true، قد تُرسل حزم UDP إلى عنوان بث الواجهة المحلية.

socket.setMulticastInterface(multicastInterface)‎

أُضيف مع الإصدار: v8.6.0.

multicastInterface من النوع <string>.

ملاحظة: تشير كافة المراجع الهامة في هذا القسم إلى مؤشرات منطقة IPv6 (أو IPv6 Zone Indices)، والتي تُعرَّف بواسطة RFC 4007. في صورة السلسلة، يُكتب الـ IP مع مؤشر نطاق على الصورة 'IP%scope' حيث يكون النطاق scope هو اسم واجهة اتصال أو رقمها.

يُحدد واجهة البث المتعدد الصادر الافتراضية للمقبس إلى واجهة مختارة أو العودة إلى تحديد النظام للواجهة. يجب أن تكون multicastInterface تمثيل سلسلة صالح لـ IP من نفس عائلة المقبس.

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

بالنسبة لمقابس IPv6، يجب أن تتضمن multicastInterface نطاقً

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

أمثلة واجهة البث المتعدد الصادر لـ IPv6

في معظم الأنظمة، حيث يستخدم تنسيق النطاق اسم واجهة الاتصال:

const socket = dgram.createSocket('udp6');

socket.bind(1234, () => {
  socket.setMulticastInterface('::%eth1');
});

علي Windows، حيث يستخدم تنسيق النطاق رقم الواجهة:

const socket = dgram.createSocket('udp6');

socket.bind(1234, () => {
  socket.setMulticastInterface('::%2');
});

أمثلة: واجهة البث المتعدد الصادر لـ IPv4

تستخدم جميع الأنظمة IP الخاص بالمضيف علي الواجهة الفعلية المطلوبة:

const socket = dgram.createSocket('udp4');

socket.bind(1234, () => {
  socket.setMulticastInterface('10.0.0.2');
});

نتائج الاستدعاءات

قد يطلق الاستدعاء علي مقبس غير جاهز للإرسال أو لم يعد مفتوحًا Error بأنه لا يعمل.

إذا كان لا يمكن تحليل multicastInterface إلى IP سينطلق System Error من النوع EINVAL.

علي IPv4، إذا كان multicastInterface عنوان صالح ولكن لا يطابق أي واجهة، أو إذا كان العنوان لا يطابق العائلة سينطلق System Error مثل EADDRNOTAVAIL أو EPROTONOSUP.

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

يمكن استخدام أي عنوان ANY لعائلة عنوان مقبس ('0.0.0.0' لـ IPv4 أو '::' لـ IPv6) لإعادة التحكم في واجهة اتصال المقبس الافتراضية الصادرة إلى النظام استعدادًا لحزم البث المتعدد المستقبلية.

socket.setMulticastLoopback(flag)‎

أُضيف مع الإصدار: v0.3.8.

flag من النوع <boolean>.

ضبط أو مسح خيار المقبس IP_MULTICAST_LOOP. عند ضبطه بالقيمة true، ستُستقبَل أيضًا حزم البث المتعدد علي الواجهة المحلية.

socket.setMulticastTTL(ttl)‎

أُضيف مع الإصدار: v0.3.8.

ttl من النوع <integer>.

يضبط خيار المقبس IP_MULTICAST_TTL. بينما يرمز TTL عمومًا إلى "الوقت للعيش" (Time to Live)، فانه يحدد في هذا السياق عدد الخطوات IP التي يُسمح بها للحزمة للانتقال خلالها، وتحديدًا لحركة مرور البث المتعدد. ويُنقِص كل جهاز توجيه (router) أو مَعبر (gateway) يعيد توجيه الحزمة من مقدار TTL. لن يعاد التوجيه إذا نقص TTL حتى يبلغ 0 بواسطة جهاز توجيه.

الوسيط المُمرر إلى socket.setMulticastTTL()‎ هو عدد الخطوات بين 0 و 255. العدد الافتراضي على معظم الأنظمة هو 1 ولكن يمكن أن يختلف.

socket.setRecvBufferSize(size)‎

أُضيف مع الإصدار: v8.7.0.

size من النوع <integer>.

يضبط خيار المقبس SO_RCVBUF. تعيين الحد الأقصى للمخزن المؤقت لاستقبال المقبس بالبايت.

socket.setSendBufferSize(size)

أُضيف مع الإصدار: v8.7.0.

size من النوع <integer>.

يضبط خيار المقبس SO_SNDBUF. تعيين الحد الأقصى للمخزن المؤقت لإرسال المقبس بالبايت.

socket.setTTL(ttl)‎

أضيف مع الإصدار: v0.1.101.

ttl من النوع <integer>.

يضبط خيار المقبس IP_TTL. بينما يرمز TTL عمومًا إلى "الوقت للعيش" (Time to Live)، فانه يحدد في هذا السياق عدد الخطوات IP التي يُسمح بها للحزمة للانتقال خلالها. ينقص كل جهاز توجيه (router) أو مَعبر (gateway) يعيد توجيه الحزمة من TTL. لن يعاد التوجيه إذا نقص TTL حتى يبلغ 0 بواسطة جهاز توجيه. وعادة ما تتغير قيم TTL عند استكشاف الشبكة أو عند البث المتعدد.

الوسيط المُمرر إلى socket.setTTL()‎ هو عدد الخطوات بين 0 و 255. العدد الافتراضي على معظم الأنظمة هو 64 ولكن يمكن أن يختلف.

socket.unref()‎

أُضيف مع الإصدار: v0.9.1.

بشكل افتراضي، سيؤدي ربط مقبس إلى حظر عملية Node.js من الإنهاء طالما أن المقبس مفتوحًا. يمكن استخدام التابع socket.unref()‎ لاستثناء المقبس من حساب المراجع الذي يحتفظ بعملية Node.js نشطة، مما يسمح للعملية بالخروج حتى لو كان المقبس لا يزال يستمع.

استدعاء socket.unref()‎ عدة مرات لن يكون له أي تأثير إضافي.

يُعيد التابع socket.unref()‎ مرجع إلى للمقبس بحيث يمكن تسلسل الإتصالات.

تغيير إلى سلوك `socket.bind()‎` غير المتزامن.

اعتبارا من Node.js الإصدار v0.10، تغيَّر dgram.Socketbind()‎ إلى نموذج تنفيذ غير متزامن. قد تستخدم التعليمات البرمجية القديمة السلوك المتزامن:

const s = dgram.createSocket('udp4');
s.bind(1234);
s.addMembership('224.0.0.114');

يجب تغيير هذه التعليمات البرمجية القديمة لتمرير دالة رد اتصال إلى دالة dgram.Socketbind()‎:

const s = dgram.createSocket('udp4');
s.bind(1234, () => {
  s.addMembership('224.0.0.114');
});

دوال الوحدة 'dgram'

dgram.createSocket(options[, callback])‎

سجل التغييرات

الإصدار التغييرات
v8.7.0 إضافة دعم خيارات recvBufferSize و sendBufferSize.
v8.6.0 إضافة دعم خيار lookup .
v0.11.13 أضيف مع الإصدار : v0.11.13
  • options من النوع <Object>. الخيارات المتاحة هي:
    • type من النوع <string> وهو عائلة المقبس. يجب أن يكون إما 'udp4' أو 'udp6'. ويجب إدخاله.
    • reususaddress من النوع <boolean>. عندما يكون true سيعيد socket.bind()‎ استخدام العنوان، حتى إذا ربطت عملية أخرى مقبسًا بالفعل بها. القيمة الافتراضية: false.
    • recvBufferSize من النوع <number> - تعيين قيمة مقبس SO_RCVBUF.
    • sendBufferSize من النوع <number> - تعيين قيمة مقبس SO_SNDBUF.
    • lookup من النوع <function> وهي دالة بحث مخصصة. القيمة الافتراضية: dns.lookup()‎.
  • callback من النوع<function> وهي دالة مرفقة كمستمع لأحداث 'message'. وهي دالة اختيارية.
  • القيمة المُعادة: من النوع <dgram.Socket>.

إنشاء كائن dgram.Socket. بمجرد إنشاء مقبس، سيرشد استدعاء socket.bind()‎ المقبس لبدء الاستماع لرسائل مخطط البيانات. عندما لا يُمرر address و port إلى socket.bind()‎ سيربط التابعُ المقبسَ إلى عنوان "كافة واجهات" علي منفذ عشوائي (ويفعل الشيء الصحيح لكلا من مقابس udp4 و udp6). يمكن استرداد العنوان والمنفذ المنضمَين باستخدام socket.address()‎.address و socket.address()‎.port.

dgram.createSocket(type[, callback])‎

أُضيف مع الإصدار: v0.1.99.

type من النوع <string> - إما 'udp4' أو 'udp6'.

callback من النوع <function> وهي دالة مرفقة كمستمع لأحداث 'message'.

القيمة المُعادة: من النوع <dgram.Socket>.

إنشاء كائن dgram.Socket من النوع المحدد type. يمكن أن يكون الوسيط type إما 'udp4' أو 'udp6'. ,يمكن تمرير دالة callback اختيارية تضاف كمستمع لأحداث 'message'.

بمجرد إنشاء مقبس، سيرشد استدعاء socket.bind()‎ المقبس لبدء الاستماع لرسائل مخطط البيانات. عندما لا يُمرر address و port إلى socket.bind()‎ سيربط التابعُ المقبسَ إلى عنوان "كافة واجهات" علي منفذ عشوائي (ويفعل الشيء الصحيح لكلا من مقابس udp4 و udp6). يمكن استرداد العنوان والمنفذ المنضمَين باستخدام socket.address()‎.address و socket.address()‎.port.

مصادر