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
.
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
.