ربط مقبس UDP (Bun.udpSocket())
لإنشاء مقبس UDP (مربوط) جديد:
const socket = await Bun.udpSocket({});
console.log(socket.port); // تم تعيينه بواسطة نظام التشغيلتحديد منفذ:
const socket = await Bun.udpSocket({
port: 41234,
});
console.log(socket.port); // 41234إرسال مخطط بيانات
حدد البيانات المراد إرسالها، بالإضافة إلى منفذ الوجهة والعنوان.
socket.send("Hello, world!", 41234, "127.0.0.1");لاحظ أنه يجب أن يكون العنوان عنوان IP صالح - لا يُجري send حل DNS، لأنه مخصص للعمليات ذات الكمون المنخفض.
استلام مخططات البيانات
عند إنشاء المقبس الخاص بك، أضف استدعاءً لتحديد ما يجب فعله عند استلام الحزم:
const server = await Bun.udpSocket({
socket: {
data(socket, buf, port, addr) {
console.log(`رسالة من ${addr}:${port}:`);
console.log(buf.toString());
},
},
});
const client = await Bun.udpSocket({});
client.send("Hello!", server.port, "127.0.0.1");الاتصالات
على الرغم من أن UDP ليس لديه مفهوم للاتصال، فإن العديد من اتصالات UDP (خاصة كعميل) تتضمن نظيرًا واحدًا فقط. في مثل هذه الحالات، قد يكون من المفيد ربط المقبس بهذا النظير، مما يحدد العنوان الذي تُرسل إليه جميع الحزم ويقتصر الحزم الواردة على هذا النظير فقط.
const server = await Bun.udpSocket({
socket: {
data(socket, buf, port, addr) {
console.log(`رسالة من ${addr}:${port}:`);
console.log(buf.toString());
},
},
});
const client = await Bun.udpSocket({
connect: {
port: server.port,
hostname: "127.0.0.1",
},
});
client.send("Hello");نظرًا لأن الاتصالات يتم تنفيذها على مستوى نظام التشغيل، يمكنك ربما ملاحظة فوائد في الأداء أيضًا.
إرسال العديد من الحزم دفعة واحدة باستخدام sendMany()
إذا كنت ترغب في إرسال حجم كبير من الحزم دفعة واحدة، فقد يكون من المنطقي تجميعها جميعًا معًا لتجنب النفقات العامة لإجراء استدعاء نظام لكل حزمة. هذا ممكن بفضل واجهة برمجة تطبيقات sendMany():
بالنسبة لمقبس غير متصل، يأخذ sendMany مصفوفة كوسيطة وحيدة. كل مجموعة من ثلاثة عناصر في المصفوفة تصف حزمة: العنصر الأول هو البيانات المراد إرسالها، والثاني هو المنفذ المستهدف، والأخير هو العنوان المستهدف.
const socket = await Bun.udpSocket({});
// يرسل 'Hello' إلى 127.0.0.1:41234، و 'foo' إلى 1.1.1.1:53 في عملية واحدة
socket.sendMany(["Hello", 41234, "127.0.0.1", "foo", 53, "1.1.1.1"]);مع مقبس متصل، يأخذ sendMany ببساطة مصفوفة، حيث يمثل كل عنصر البيانات المراد إرسالها إلى النظير.
const socket = await Bun.udpSocket({
connect: {
port: 41234,
hostname: "localhost",
},
});
socket.sendMany(["foo", "bar", "baz"]);يرجع sendMany عدد الحزم التي تم إرسالها بنجاح. كما هو الحال مع send، يأخذ sendMany فقط عناوين IP صالحة كوجهات، لأنه لا يُجري حل DNS.
معالجة backpressure
قد يحدث أن الحزمة التي ترسلها لا تتناسب مع مخزن حزم نظام التشغيل. يمكنك اكتشاف حدوث ذلك عندما:
sendيرجعfalsesendManyيرجع رقمًا أصغر من عدد الحزم التي حددتها. في هذه الحالة، سيتم استدعاء معالج المقبسdrainبمجرد أن يصبح المقبس قابلًا للكتابة مرة أخرى:
const socket = await Bun.udpSocket({
socket: {
drain(socket) {
// الاستمرار في إرسال البيانات
},
},
});