هذا تطبيق ENet مستقل مع بروتوكول معدّل لـ C وC++ وC# ولغات أخرى.
سمات:
من فضلك، اقرأ الأخطاء الشائعة للحصول على فكرة عن الأخطاء التي يمكن أن تحدث.
لبناء المكتبة الأصلية، يلزم وجود برنامج مناسب:
لمنصات سطح المكتب CMake مع GNU Make أو Visual Studio.
لمنصات الأجهزة المحمولة NDK لنظام Android وXcode لنظام iOS. تأكد من تعيين جميع المكتبات المترجمة للأنظمة الأساسية وبنيات وحدة المعالجة المركزية المناسبة.
لإنشاء مكتبة Nintendo Switch، اتبع هذا الدليل.
يمكن إنشاء تجميع مُدار باستخدام أي منصة ترجمة متاحة تدعم الإصدار C# 3.0 أو أعلى.
يمكنك الحصول على المكتبات المجمعة من قسم الإصدار أو من NuGet:
يحتوي ENet-CSharp
على تجميع مجمع مع مكتبات أصلية لبيئة .NET (.NET Standard 2.1).
يحتوي ENet-Unity
على برنامج نصي يحتوي على مكتبات أصلية للوحدة.
يوصى بشدة بحذف مجلد يحتوي على ثنائيات بدلاً من استبداله للترقية.
يتم توفير هذه الحزم فقط للأنظمة الأساسية التقليدية: Windows وLinux وmacOS (x64).
إصدارات نظام التشغيل المدعومة:
قبل البدء في العمل، يجب تهيئة المكتبة باستخدام ENet.Library.Initialize();
وظيفة.
بعد الانتهاء من العمل، قم بإلغاء تهيئة المكتبة باستخدام ENet.Library.Deinitialize();
وظيفة.
using ( Host server = new Host ( ) ) {
Address address = new Address ( ) ;
address . Port = port ;
server . Create ( address , maxClients ) ;
Event netEvent ;
while ( ! Console . KeyAvailable ) {
bool polled = false ;
while ( ! polled ) {
if ( server . CheckEvents ( out netEvent ) <= 0 ) {
if ( server . Service ( 15 , out netEvent ) <= 0 )
break ;
polled = true ;
}
switch ( netEvent . Type ) {
case EventType . None :
break ;
case EventType . Connect :
Console . WriteLine ( "Client connected - ID: " + netEvent . Peer . ID + ", IP: " + netEvent . Peer . IP ) ;
break ;
case EventType . Disconnect :
Console . WriteLine ( "Client disconnected - ID: " + netEvent . Peer . ID + ", IP: " + netEvent . Peer . IP ) ;
break ;
case EventType . Timeout :
Console . WriteLine ( "Client timeout - ID: " + netEvent . Peer . ID + ", IP: " + netEvent . Peer . IP ) ;
break ;
case EventType . Receive :
Console . WriteLine ( "Packet received from - ID: " + netEvent . Peer . ID + ", IP: " + netEvent . Peer . IP + ", Channel ID: " + netEvent . ChannelID + ", Data length: " + netEvent . Packet . Length ) ;
netEvent . Packet . Dispose ( ) ;
break ;
}
}
}
server . Flush ( ) ;
}
using ( Host client = new Host ( ) ) {
Address address = new Address ( ) ;
address . SetHost ( ip ) ;
address . Port = port ;
client . Create ( ) ;
Peer peer = client . Connect ( address ) ;
Event netEvent ;
while ( ! Console . KeyAvailable ) {
bool polled = false ;
while ( ! polled ) {
if ( client . CheckEvents ( out netEvent ) <= 0 ) {
if ( client . Service ( 15 , out netEvent ) <= 0 )
break ;
polled = true ;
}
switch ( netEvent . Type ) {
case EventType . None :
break ;
case EventType . Connect :
Console . WriteLine ( "Client connected to server" ) ;
break ;
case EventType . Disconnect :
Console . WriteLine ( "Client disconnected from server" ) ;
break ;
case EventType . Timeout :
Console . WriteLine ( "Client connection timeout" ) ;
break ;
case EventType . Receive :
Console . WriteLine ( "Packet received from server - Channel ID: " + netEvent . ChannelID + ", Data length: " + netEvent . Packet . Length ) ;
netEvent . Packet . Dispose ( ) ;
break ;
}
}
}
client . Flush ( ) ;
}
Packet packet = default ( Packet ) ;
byte [ ] data = new byte [ 64 ] ;
packet . Create ( data ) ;
peer . Send ( channelID , ref packet ) ;
byte [ ] buffer = new byte [ 1024 ] ;
netEvent . Packet . CopyTo ( buffer ) ;
AllocCallback OnMemoryAllocate = ( size ) => {
return Marshal . AllocHGlobal ( size ) ;
} ;
FreeCallback OnMemoryFree = ( memory ) => {
Marshal . FreeHGlobal ( memory ) ;
} ;
NoMemoryCallback OnNoMemory = ( ) => {
throw new OutOfMemoryException ( ) ;
} ;
Callbacks callbacks = new Callbacks ( OnMemoryAllocate , OnMemoryFree , OnNoMemory ) ;
if ( ENet . Library . Initialize ( callbacks ) )
Console . WriteLine ( "ENet successfully initialized using a custom memory allocator" ) ;
الاستخدام هو نفسه تقريبًا كما هو الحال في بيئة .NET، باستثناء أنه يجب استبدال وظائف وحدة التحكم بالوظائف التي توفرها Unity. إذا كان سيتم استدعاء Host.Service()
في حلقة اللعبة، فتأكد من تعيين معلمة المهلة على 0 مما يعني عدم الحظر. أيضًا، استمر في تشغيل Unity في الخلفية من خلال تمكين الخيار المناسب في إعدادات المشغل.
الإستراتيجية الأكثر شهرة هي استخدام ENet في سلسلة عمليات إدخال/إخراج مستقلة واستخدام تقنيات المراسلة بين سلاسل العمليات لنقل البيانات عبر سلاسل العمليات/المهام دون أي أقفال/كائنات مزامنة. تم تصميم قوائم الانتظار غير المحظورة مثل Ring Buffer لمثل هذه الأغراض. يمكن موازنة التجريدات والمنطق عالي المستوى باستخدام العمال، ثم التواصل مع مؤشر ترابط الإدخال / الإخراج ورسائل قائمة الانتظار / إلغاء قائمة الانتظار لإرسال / استقبال البيانات عبر الشبكة.
بشكل عام، ENet ليس آمنًا لمؤشر الترابط، ولكن يمكن استخدام بعض وظائفه بأمان إذا كان المستخدم حذرًا بدرجة كافية:
تكون بنية Packet
ووظائفها آمنة حتى تتحرك الحزمة فقط عبر مؤشرات الترابط حسب القيمة ولا يتم استخدام مخصص ذاكرة مخصص.
Peer.ID
بمجرد الحصول على مؤشر إلى نظير من الجانب الأصلي، سيتم تخزين المعرف مؤقتًا في بنية Peer
لمزيد من الإجراءات مع الكائنات التي تم تعيينها لهذا المعرف. يمكن نقل البنية Peer
عبر سلاسل الرسائل حسب القيمة، لكن وظائفها ليست آمنة لسلاسل الرسائل لأن البيانات الموجودة في الذاكرة قد تتغير بواسطة الخدمة في مؤشر ترابط آخر.
يستخدم Library.Time
البدائيات الذرية داخليًا لإدارة الوقت الرتيب المحلي.
تعريفات العلامات لوظيفة Peer.Send()
:
PacketFlags.None
غير موثوق بها، ولا يتم ضمان تسليم الحزمة.
PacketFlags.Reliable
متسلسلة وموثوقة، يجب أن يتم استلام الحزمة من قبل النظير المستهدف ويجب إجراء محاولات إعادة الإرسال حتى يتم تسليم الحزمة.
PacketFlags.Unsequenced
لن يتم تسلسل الحزمة مع الحزم الأخرى وقد يتم تسليمها خارج الترتيب. هذه العلامة تجعل التسليم غير موثوق.
PacketFlags.NoAllocate
لن تقوم الحزمة بتخصيص البيانات، ويجب على المستخدم توفيرها بدلاً من ذلك. يجب تتبع عمر الحزمة باستخدام رد الاتصال PacketFreeCallback
.
PacketFlags.UnreliableFragmented
سيتم تجزئة الحزمة بشكل غير موثوق إذا تجاوزت وحدة الإرسال الكبرى (MTU). افتراضيًا، يتم تجزئة الحزم غير الموثوقة التي تتجاوز وحدة الإرسال الكبرى (MTU) وإرسالها بشكل موثوق. يجب استخدام هذه العلامة للإشارة بوضوح إلى الحزم التي يجب أن تظل غير موثوقة.
PacketFlags.Instant
لن يتم تجميع الحزمة مع الحزم الأخرى في تكرار الخدمة التالي وسيتم إرسالها على الفور بدلاً من ذلك. يقوم نوع التسليم هذا بتداول كفاءة تعدد الإرسال لصالح زمن الوصول. لا يمكن استخدام نفس الحزمة لإجراء مكالمات Peer.Send()
متعددة.
PacketFlags.Unthrottled
يجب عدم إسقاط الحزمة التي تم وضعها في قائمة الانتظار للإرسال بشكل غير موثوق بسبب التقييد وإرسالها إن أمكن.
PacketFlags.Sent
تم إرسال حزمة من كافة قوائم الانتظار التي تم إدخالها.
تعريفات أنواع الأحداث لخاصية Event.Type
:
EventType.None
لم يحدث أي حدث خلال المهلة الزمنية المحددة.
EventType.Connect
اكتمل طلب الاتصال الذي بدأته وظيفة Peer.Connect()
. يقوم Event.Peer
بإرجاع نظير تم الاتصال به بنجاح. تقوم Event.Data
بإرجاع البيانات التي قدمها المستخدم والتي تصف الاتصال أو 0 في حالة عدم توفر أي منها.
EventType.Disconnect
تم قطع اتصال أحد الأقران. يتم إنشاء هذا الحدث عند إكمال عملية قطع الاتصال التي بدأتها الدالة Peer.Disconnect()
بنجاح. يقوم Event.Peer
بإرجاع النظير الذي تم قطع اتصاله. تقوم Event.Data
بإرجاع البيانات التي قدمها المستخدم والتي تصف قطع الاتصال أو 0 في حالة عدم توفر أي منها.
EventType.Receive
تم تلقي حزمة من أحد الأقران. يقوم Event.Peer
بإرجاع النظير الذي أرسل الحزمة. يحدد Event.ChannelID
رقم القناة التي تم استلام الحزمة عليها. يقوم Event.Packet
بإرجاع حزمة تم استلامها، ويجب تدمير هذه الحزمة باستخدام الدالة Event.Packet.Dispose()
بعد الاستخدام.
EventType.Timeout
لقد انتهت مهلة النظير. يحدث هذا الحدث إذا انتهت مهلة النظير أو إذا انتهت مهلة طلب الاتصال الذي تمت تهيئته بواسطة Peer.Connect()
. يقوم Event.Peer
بإرجاع النظير الذي انتهت مهلته.
تعريفات الدول النظيرة لملكية Peer.State
:
PeerState.Uninitialized
نظير لم تتم تهيئته.
PeerState.Disconnected
نظير تم قطع اتصاله أو انتهت مهلته.
PeerState.Connecting
اتصال نظير قيد التقدم.
PeerState.Connected
تم توصيل النظير بنجاح.
PeerState.Disconnecting
قطع اتصال النظير قيد التقدم.
PeerState.Zombie
نظير لم يتم قطع اتصاله بشكل صحيح.
يوفر لكل أحداث التطبيق.
يقوم AllocCallback(IntPtr size)
بإعلامك عند طلب الذاكرة للتخصيص. يتوقع المؤشر إلى الذاكرة المخصصة حديثا. يجب الحفاظ على الإشارة إلى المفوض من تجميع البيانات المهملة.
يقوم FreeCallback(IntPtr memory)
بإعلامك عندما يمكن تحرير الذاكرة. يجب الحفاظ على الإشارة إلى المفوض من تجميع البيانات المهملة.
يقوم NoMemoryCallback()
بإعلامك عندما تكون الذاكرة غير كافية. يجب الحفاظ على الإشارة إلى المفوض من تجميع البيانات المهملة.
يوفر لكل أحداث الحزمة.
يقوم PacketFreeCallback(Packet packet)
بإعلامك عند تدمير الحزمة. يشير إلى ما إذا تم الاعتراف بحزمة موثوقة. يجب الحفاظ على الإشارة إلى المفوض من تجميع البيانات المهملة.
يوفر لكل الأحداث المضيفة.
InterceptCallback(ref Event @event, ref Address address, IntPtr receivedData, int receivedDataLength)
بإعلامك عند اعتراض حزمة UDP الأولية. رمز الحالة الذي تم إرجاعه من رد الاتصال هذا يرشد ENet إلى كيفية التعامل مع الحدث المحدد. يشير الرجوع 1 إلى إرسال الحدث المحدد بواسطة الخدمة. تشير إرجاع 0 إلى أن أنظمة ENet الفرعية يجب أن تتعامل مع البيانات المستلمة. تشير إرجاع -1 إلى وجود خطأ. يجب الحفاظ على الإشارة إلى المفوض من تجميع البيانات المهملة.
يُعلم ChecksumCallback(IntPtr buffers, int bufferCount)
متى يجب حساب المجموع الاختباري للمخازن المؤقتة عند الإرسال والاستقبال. القيمة التي يتم إرجاعها من رد الاتصال هذا هي مجموع اختباري 64 بت. تقوم ENet تلقائيًا بمعالجة التحقق من سلامة الحزم إذا تم تمكين آلية المجموع الاختباري في كلا الطرفين. يمكن استخدامه مع الدالة ENet.Library.CRC64()
. يجب الحفاظ على الإشارة إلى المفوض من تجميع البيانات المهملة.
يحتوي على بنية مع بيانات مضيف مجهولة ورقم المنفذ.
يحصل Address.Port
على رقم المنفذ أو يقوم بتعيينه.
يحصل Address.GetIP()
على عنوان IP.
يقوم Address.SetIP(string ip)
بتعيين عنوان IP. لاستخدام بث IPv4 في الشبكة المحلية، يمكن ضبط العنوان على 255.255.255.255 للعميل. سوف تستجيب ENet تلقائيًا للبث وتقوم بتحديث العنوان إلى عنوان IP الفعلي للخادم.
يحاول Address.GetHost()
إجراء بحث عكسي من العنوان. تقوم بإرجاع سلسلة باسم تم حله أو عنوان IP.
يقوم Address.SetHost(string hostName)
بتعيين اسم المضيف أو عنوان IP. ينبغي استخدامه للربط بواجهة شبكة أو للاتصال بمضيف أجنبي. إرجاع صحيح عند النجاح أو خطأ عند الفشل.
يحتوي على بنية مع نوع الحدث، ومؤشر مُدار إلى النظير، ومعرف القناة، والبيانات التي يوفرها المستخدم، ومؤشر مُدار إلى الحزمة.
Event.Type
يُرجع نوع الحدث.
يقوم Event.Peer
بإرجاع النظير الذي قام بإنشاء حدث اتصال أو قطع اتصال أو تلقي أو انتهاء المهلة.
يقوم Event.ChannelID
بإرجاع معرف القناة على النظير الذي أنشأ الحدث، إذا كان ذلك مناسبًا.
تقوم Event.Data
بإرجاع البيانات التي قدمها المستخدم، إذا كان ذلك مناسبًا.
يقوم Event.Packet
بإرجاع حزمة مرتبطة بالحدث، إذا كان ذلك مناسبًا.
يحتوي على مؤشر مُدار للحزمة.
يقوم Packet.Dispose()
بتدمير الحزمة. يجب أن يتم استدعاؤه فقط عند الحصول على الحزمة من حدث EventType.Receive
.
تقوم Packet.IsSet
بإرجاع حالة المؤشر المُدار.
تقوم Packet.Data
بإرجاع مؤشر مُدار إلى بيانات الحزمة.
يحصل Packet.UserData
على البيانات التي يوفرها المستخدم أو يقوم بتعيينها.
تقوم Packet.Length
بإرجاع طول الحمولة في الحزمة.
يقوم Packet.HasReferences
بالتحقق من المراجع الخاصة بالحزمة.
يقوم Packet.SetFreeCallback(PacketFreeCallback callback)
بتعيين رد الاتصال للإعلام عند تدمير الحزمة المناسبة. يمكن استخدام مؤشر IntPtr
لرد الاتصال بدلاً من الإشارة إلى المفوض.
Packet.Create(byte[] data, int offset, int length, PacketFlags flags)
بإنشاء حزمة يمكن إرسالها إلى نظير. تشير معلمة الإزاحة إلى نقطة بداية البيانات في المصفوفة، والطول هو نقطة نهاية البيانات في المصفوفة. جميع المعلمات اختيارية. يمكن تحديد أعلام حزم متعددة في وقت واحد. يمكن استخدام مؤشر IntPtr
إلى المخزن المؤقت الأصلي بدلاً من مرجع إلى صفيف بايت.
يقوم Packet.CopyTo(byte[] destination)
بنسخ الحمولة من الحزمة إلى صفيف الوجهة.
يحتوي على مؤشر مُدار للنظير والمعرف المخزن مؤقتًا.
تقوم Peer.IsSet
بإرجاع حالة المؤشر المُدار.
يقوم Peer.ID
بإرجاع معرف النظير. إنه دائمًا صفر من جانب العميل.
يقوم Peer.IP
بإرجاع عنوان IP في نموذج قابل للطباعة.
يقوم Peer.Port
بإرجاع رقم المنفذ.
تقوم Peer.MTU
بإرجاع MTU.
تقوم Peer.State
بإرجاع حالة النظير الموضحة في تعداد PeerState
.
تقوم Peer.RoundTripTime
بإرجاع وقت الرحلة ذهابًا وإيابًا بالمللي ثانية.
تقوم Peer.LastRoundTripTime
بإرجاع وقت ذهابًا وإيابًا منذ آخر إقرار بالمللي ثانية.
يقوم Peer.LastSendTime
بإرجاع وقت إرسال الحزمة الأخيرة بالمللي ثانية.
يقوم Peer.LastReceiveTime
بإرجاع وقت تلقي الحزمة الأخيرة بالمللي ثانية.
يقوم Peer.PacketsSent
بإرجاع إجمالي عدد الحزم المرسلة أثناء الاتصال.
تقوم Peer.PacketsLost
بإرجاع إجمالي عدد الحزم التي تعتبر مفقودة أثناء الاتصال بناءً على منطق إعادة الإرسال.
تقوم Peer.PacketsThrottle
بإرجاع نسبة من الحزم التي تعتمد على شروط الاتصال بالنظير.
تقوم Peer.BytesSent
بإرجاع إجمالي عدد البايتات المرسلة أثناء الاتصال.
تقوم Peer.BytesReceived
بإرجاع إجمالي عدد البايتات المتلقاة أثناء الاتصال.
تحصل Peer.Data
على البيانات التي يقدمها المستخدم أو تقوم بتعيينها. يجب استخدامه مع قالب واضح لنوع البيانات المناسب.
يقوم Peer.ConfigureThrottle(uint interval, uint acceleration, uint deceleration, uint threshold)
بتكوين معلمة الخانق للنظير. يتم إسقاط الحزم غير الموثوقة بواسطة ENet استجابةً لظروف الاتصال المختلفة بالنظير. يمثل الخانق احتمال عدم إسقاط حزمة غير موثوقة وبالتالي إرسالها بواسطة ENet إلى النظير. يتم قياس أقل متوسط وقت ذهابًا وإيابًا من إرسال حزمة موثوقة إلى استلام إقرارها على مدى فترة زمنية محددة بواسطة معلمة الفاصل الزمني بالمللي ثانية. إذا كان وقت رحلة الذهاب والإياب المقاس أقل بكثير من متوسط وقت رحلة الذهاب والإياب المقاس خلال الفاصل الزمني، فسيتم زيادة احتمال الخانق للسماح بمزيد من حركة المرور بمقدار محدد في معلمة التسارع، وهي نسبة إلى Library.throttleScale
ثابت. إذا كان وقت الذهاب والإياب المقاس أكبر بكثير من متوسط وقت الذهاب والإياب المقاس خلال الفاصل الزمني، فسيتم تقليل احتمالية الخانق للحد من حركة المرور بمقدار محدد في معلمة التباطؤ، وهي نسبة إلى Library.throttleScale
ثابت Library.throttleScale
. عندما يكون للخانق قيمة Library.throttleScale
، لن يتم إسقاط أي حزم غير موثوقة بواسطة ENet، وبالتالي سيتم إرسال 100% من جميع الحزم غير الموثوقة. عندما تكون قيمة الخانق 0، يتم إسقاط جميع الحزم غير الموثوقة بواسطة ENet، وبالتالي سيتم إرسال 0% من جميع الحزم غير الموثوقة. تمثل القيم المتوسطة للخانق احتمالات متوسطة بين 0% و100% من الحزم غير الموثوقة التي يتم إرسالها. يتم أخذ حدود عرض النطاق الترددي للمضيفين المحليين والأجانب بعين الاعتبار لتحديد حد معقول لاحتمال الخانق والذي لا ينبغي أن يرتفع فوقه حتى في أفضل الظروف. لتعطيل الاختناق، يجب ضبط معلمة التباطؤ على الصفر. يمكن استخدام معلمة العتبة لتقليل اختناق الحزم بالنسبة إلى وقت الرحلة ذهابًا وإيابًا المقاس في بيئات الشبكات غير المستقرة ذات الارتعاش العالي ومتوسط زمن الوصول المنخفض وهو شرط شائع لشبكات Wi-Fi في الأماكن المزدحمة. افتراضيًا، يتم تعيين معلمة العتبة على Library.throttleThreshold
بالمللي ثانية.
يقوم Peer.Send(byte channelID, ref Packet packet)
بوضع حزمة ليتم إرسالها في قائمة الانتظار. إرجاع صحيح عند النجاح أو خطأ عند الفشل.
يحاول Peer.Receive(out byte channelID, out Packet packet)
إلغاء وضع أي حزمة واردة في قائمة الانتظار. يُرجع صحيحًا إذا كانت الحزمة في قائمة الانتظار أو يُرجع خطأ إذا لم تكن هناك حزم متاحة.
يرسل Peer.Ping()
طلب ping إلى أحد الأقران. تقوم ENet تلقائيًا بإجراء اختبار ping لجميع الأقران المتصلين على فترات زمنية منتظمة، ومع ذلك، قد يتم استدعاء هذه الوظيفة لضمان طلبات ping أكثر تكرارًا.
يقوم Peer.PingInterval(uint interval)
بتعيين الفاصل الزمني الذي سيتم فيه إرسال أوامر ping إلى النظير. تُستخدم اختبارات الاتصال لمراقبة حيوية الاتصال وأيضًا لضبط الخانق ديناميكيًا أثناء فترات انخفاض حركة المرور بحيث يتمتع الخانق باستجابة معقولة أثناء ارتفاع حركة المرور.
Peer.Timeout(uint timeoutLimit, uint timeoutMinimum, uint timeoutMaximum)
يقوم بتعيين معلمات المهلة للنظير. تتحكم معلمات المهلة في كيفية ووقت انتهاء مهلة النظير بسبب الفشل في التعرف على حركة المرور الموثوقة. قيم المهلة المستخدمة في الآلية شبه الخطية، حيث إذا لم يتم التعرف على حزمة موثوقة خلال متوسط وقت الذهاب والإياب بالإضافة إلى تفاوت التفاوت حتى تصل المهلة إلى الحد المحدد. إذا كانت المهلة عند هذا الحد وتم إرسال حزم موثوقة ولكن لم يتم الإقرار بها خلال فترة زمنية دنيا معينة، فسيتم قطع اتصال النظير. وبدلاً من ذلك، إذا تم إرسال حزم موثوقة ولكن لم يتم الإقرار بها لفترة زمنية قصوى معينة، فسيتم قطع اتصال النظير بغض النظر عن قيمة حد المهلة الحالية.
يطلب Peer.Disconnect(uint data)
قطع الاتصال من أحد الأقران.
يفرض Peer.DisconnectNow(uint data)
قطع الاتصال الفوري من النظير.
يطلب Peer.DisconnectLater(uint data)
قطع الاتصال من النظير، ولكن فقط بعد إرسال كافة الحزم الصادرة في قائمة الانتظار.
Peer.Reset()
يقطع اتصال النظير بالقوة. لا يتم إخطار المضيف الأجنبي الذي يمثله النظير بقطع الاتصال وسوف تنتهي مهلة اتصاله بالمضيف المحلي.
يحتوي على مؤشر مُدار للمضيف.
Host.Dispose()
يدمر المضيف.
تقوم Host.IsSet
بإرجاع حالة المؤشر المُدار.
يقوم Host.PeersCount
بإرجاع عدد من النظراء المتصلين.
يقوم Host.PacketsSent
بإرجاع إجمالي عدد الحزم المرسلة أثناء الجلسة.
تقوم Host.PacketsReceived
بإرجاع إجمالي عدد الحزم التي تم تلقيها أثناء الجلسة.
يقوم Host.BytesSent
بإرجاع إجمالي عدد البايتات المرسلة أثناء الجلسة.
تقوم Host.BytesReceived
بإرجاع إجمالي عدد وحدات البايت التي تم تلقيها أثناء الجلسة.
Host.Create(Address? address, int peerLimit, int channelLimit, uint incomingBandwidth, uint outgoingBandwidth, int bufferSize)
بإنشاء مضيف للتواصل مع أقرانه. تحدد معلمات النطاق الترددي حجم نافذة الاتصال مما يحد من عدد الحزم الموثوقة التي قد تكون قيد النقل في أي وقت محدد. ستقوم ENet بإسقاط الحزم بشكل استراتيجي على جوانب محددة من الاتصال بين المضيفين لضمان عدم إرهاق النطاق الترددي للمضيف. يتم استخدام معلمة حجم المخزن المؤقت لتعيين حجم المخزن المؤقت للمأخذ لإرسال واستقبال مخططات البيانات. جميع المعلمات اختيارية باستثناء العنوان وحد النظير في الحالات التي يتم فيها استخدام الوظيفة لإنشاء مضيف يستمع للاتصالات الواردة.
يمنع Host.PreventConnections(bool state)
الوصول إلى المضيف للاتصالات الواردة الجديدة. تجعل هذه الوظيفة المضيف غير مرئي تمامًا في الشبكة، وأي نظير يحاول الاتصال به ستنتهي مهلة.
Host.Broadcast(byte channelID, ref Packet packet, Peer[] peers)
بوضع حزمة في قائمة الانتظار لإرسالها إلى نطاق من النظراء أو إلى جميع النظراء المرتبطين بالمضيف إذا لم يتم استخدام معلمة النظراء الاختيارية. سيتم استبعاد أي بنية Peer
صفرية في صفيف من البث. بدلاً من المصفوفة، يمكن تمرير Peer
واحد للوظيفة التي سيتم استبعادها من البث.
يتحقق Host.CheckEvents(out Event @event)
من وجود أي أحداث في قائمة الانتظار على المضيف ويرسل واحدًا إذا كان متاحًا. يُرجع > 0 في حالة إرسال حدث، و0 في حالة عدم توفر أي أحداث، و<0 في حالة الفشل.
يبدأ Host.Connect(Address address, int channelLimit, uint data)
الاتصال بمضيف أجنبي. إرجاع نظير يمثل المضيف الأجنبي عند النجاح أو طرح استثناء عند الفشل. لن يكمل النظير الذي تم إرجاعه الاتصال حتى يقوم Host.Service()
بإعلامك بحدث EventType.Connect
. يعد حد القناة ومعلمات البيانات التي يوفرها المستخدم اختيارية.
تنتظر Host.Service(int timeout, out Event @event)
الأحداث على المضيف المحدد وتقوم بنقل الحزم بين المضيف وأقرانه. تستخدم ENet نموذج حدث تم استطلاعه لإعلام المستخدم بالأحداث المهمة. يتم استقصاء مضيفي ENet للأحداث باستخدام هذه الوظيفة، حيث يمكن تحديد قيمة مهلة اختيارية بالمللي ثانية للتحكم في مدة استقصاء ENet. إذا تم تحديد مهلة 0، فستعود هذه الوظيفة على الفور إذا لم تكن هناك أحداث لإرسالها. وإلا، فسوف يُرجع 1 إذا تم إرسال حدث خلال المهلة المحددة. يجب استدعاء هذه الوظيفة بانتظام لضمان إرسال الحزم واستلامها، وإلا سيحدث ارتفاع في حركة المرور مما يؤدي إلى زيادة زمن الوصول. تعني معلمة المهلة المعينة على 0 عدم الحظر وهو أمر مطلوب في الحالات التي يتم فيها استدعاء الوظيفة في حلقة اللعبة.
يقوم Host.SetBandwidthLimit(uint incomingBandwidth, uint outgoingBandwidth)
بضبط حدود عرض النطاق الترددي للمضيف بالبايت في الثانية.
يحدد Host.SetChannelLimit(int channelLimit)
الحد الأقصى للقنوات المسموح بها للاتصالات الواردة المستقبلية.
يحدد Host.SetMaxDuplicatePeers(ushort number)
الحد الأقصى المسموح به للأقران المكررة من نفس المضيف ويمنع الاتصال إذا تم تجاوزه. افتراضيًا، يتم تعيينه على Library.maxPeers
، ولا يمكن أن يكون أقل من واحد.
يقوم Host.SetInterceptCallback(InterceptCallback callback)
بتعيين رد الاتصال للإعلام عند اعتراض حزمة UDP الأولية. يمكن استخدام مؤشر IntPtr
لرد الاتصال بدلاً من الإشارة إلى المفوض.
يقوم Host.SetChecksumCallback(ChecksumCallback callback)
بتعيين رد الاتصال لإعلامك عندما يجب حساب المجموع الاختباري. يمكن استخدام مؤشر IntPtr
لرد الاتصال بدلاً من الإشارة إلى المفوض.
يرسل Host.Flush()
أي حزم في قائمة الانتظار على المضيف المحدد إلى أقرانه المعينين.
يحتوي على حقول ثابتة.
Library.maxChannelCount
أقصى عدد ممكن من القنوات.
Library.maxPeers
أقصى عدد ممكن من الأقران.
Library.maxPacketSize
الحد الأقصى لحجم الحزمة.
Library.version
إصدار التوافق الحالي المتعلق بالمكتبة الأصلية.
تقوم Library.Time
بإرجاع الوقت الرتيب المحلي الحالي بالمللي ثانية. ولا يتم إعادة تعيينه أبدًا أثناء بقاء التطبيق على قيد الحياة.
Library.Initialize(Callbacks callbacks)
يقوم بتهيئة المكتبة الأصلية. تعد معلمة رد الاتصال اختيارية ويجب استخدامها فقط مع مخصص الذاكرة المخصص. ينبغي الاتصال به قبل البدء في العمل. إرجاع صحيح عند النجاح أو خطأ عند الفشل.
Library.Deinitialize()
تقوم بإلغاء تهيئة المكتبة الأصلية. ينبغي الاتصال به بعد الانتهاء من العمل.
Library.CRC64(IntPtr buffers, int bufferCount)
يحسب المجموع الاختباري للمخازن المؤقتة غير المُدارة.
هذا المشروع برعاية :
الترفيه السنجاب الطائر
استوديوهات الجذر التربيعي
العاب حلقة غريبة