هذا عبارة عن تجريد سهل الحمل وخفيف الوزن ومباشر وبدون تكلفة لمقابس UDP مع دعم IPv4/IPv6 مزدوج المكدس للتنفيذ السريع للبروتوكولات الموجهة للرسائل. تم تصميم المكتبة للتوافق بين اللغات مع C وC++ وC# ولغات أخرى. بالنسبة لبيئة .NET، تدعم الوظائف المؤشرات القابلة للاختراق كبديل للأنواع المُدارة للاستخدام مع مخصص الذاكرة غير المُدار.
يمكن إنشاء المكتبة الأصلية باستخدام CMake مع GNU Make أو Visual Studio.
يمكن إنشاء تجميع مُدار باستخدام أي منصة ترجمة متوفرة تدعم الإصدار C# 4.0 أو أعلى.
يمكنك الحصول على المكتبات المجمعة من قسم الإصدار.
يتم توفير الثنائيات فقط للأنظمة الأساسية التقليدية: Windows وLinux وmacOS (x64).
إصدارات نظام التشغيل المدعومة:
قبل البدء في العمل، يجب تهيئة المكتبة باستخدام NanoSockets.UDP.Initialize();
وظيفة.
بعد الانتهاء من العمل، قم بإلغاء تهيئة المكتبة باستخدام NanoSockets.UDP.Deinitialize();
وظيفة.
Socket server = UDP . Create ( 256 * 1024 , 256 * 1024 ) ;
Address listenAddress = new Address ( ) ;
listenAddress . port = port ;
if ( UDP . SetIP ( ref listenAddress , "::0" ) == Status . OK )
Console . WriteLine ( "Address set!" ) ;
if ( UDP . Bind ( server , ref listenAddress ) == 0 )
Console . WriteLine ( "Socket bound!" ) ;
if ( UDP . SetDontFragment ( server ) != Status . OK )
Console . WriteLine ( "Don't fragment option error!" ) ;
if ( UDP . SetNonBlocking ( server ) != Status . OK )
Console . WriteLine ( "Non-blocking option error!" ) ;
StringBuilder ip = new StringBuilder ( UDP . hostNameSize ) ;
Address address = new Address ( ) ;
byte [ ] buffer = new byte [ 1024 ] ;
while ( ! Console . KeyAvailable ) {
if ( UDP . Poll ( server , 15 ) > 0 ) {
int dataLength = 0 ;
while ( ( dataLength = UDP . Receive ( server , ref address , buffer , buffer . Length ) ) > 0 ) {
UDP . GetIP ( ref address , ip , ip . Capacity ) ;
Console . WriteLine ( "Message received from - IP: " + ip + ", Data length: " + dataLength ) ;
UDP . Send ( server , ref address , buffer , buffer . Length ) ;
}
}
}
UDP . Destroy ( ref server ) ;
Socket client = UDP . Create ( 256 * 1024 , 256 * 1024 ) ;
Address connectionAddress = new Address ( ) ;
connectionAddress . port = port ;
if ( UDP . SetIP ( ref connectionAddress , "::1" ) == Status . OK )
Console . WriteLine ( "Address set!" ) ;
if ( UDP . Connect ( client , ref connectionAddress ) == 0 )
Console . WriteLine ( "Socket connected!" ) ;
if ( UDP . SetDontFragment ( client ) != Status . OK )
Console . WriteLine ( "Don't fragment option error!" ) ;
if ( UDP . SetNonBlocking ( client ) != Status . OK )
Console . WriteLine ( "Non-blocking option error!" ) ;
byte [ ] buffer = new byte [ 1024 ] ;
UDP . Send ( client , IntPtr . Zero , buffer , buffer . Length ) ;
while ( ! Console . KeyAvailable ) {
if ( UDP . Poll ( client , 15 ) > 0 ) {
int dataLength = 0 ;
while ( ( dataLength = UDP . Receive ( client , IntPtr . Zero , buffer , buffer . Length ) ) > 0 ) {
Console . WriteLine ( "Message received from server - Data length: " + dataLength ) ;
UDP . Send ( client , IntPtr . Zero , buffer , buffer . Length ) ;
}
}
}
UDP . Destroy ( ref client ) ;
الاستخدام هو نفسه تقريبًا كما هو الحال في بيئة .NET، باستثناء أنه يجب استبدال وظائف وحدة التحكم بالوظائف التي توفرها Unity. إذا كان سيتم استدعاء UDP.Poll()
في حلقة اللعبة، فتأكد من تعيين معلمة المهلة على 0 مما يعني عدم الحظر. أيضًا، استمر في تشغيل Unity في الخلفية من خلال تمكين الخيار المناسب في إعدادات المشغل.
تعريفات أنواع الحالة للوظائف:
OK
Error
يحتوي على هيكل قابل للكسر مع مقبض مأخذ.
Socket.handle
مع مقبض المقبس.
يتحقق Socket.IsCreated
من إنشاء مأخذ توصيل.
يحتوي على بنية قابلة للاختراق مع بيانات مضيف مجهولة ورقم المنفذ.
Address.port
رقم المنفذ.
يقوم UDP.Initialize()
بتهيئة المكتبة الأصلية. ينبغي الاتصال به قبل البدء في العمل. إرجاع الحالة بالنتيجة.
UDP.Deinitialize()
يقوم بإلغاء تهيئة المكتبة الأصلية. ينبغي الاتصال به بعد الانتهاء من العمل.
UDP.Create(int sendBufferSize, int receiveBufferSize)
بإنشاء مأخذ توصيل جديد بحجم محدد من المخازن المؤقتة للإرسال والاستقبال. إرجاع بنية Socket
بالمقبض.
يقوم UDP.Destroy(ref Socket socket)
بتدمير مأخذ التوصيل وإعادة تعيين المقبض.
UDP.Bind(Socket socket, ref Address address)
يعين عنوانًا للمقبس. يمكن تعيين معلمة العنوان على IntPtr.Zero
للسماح لنظام التشغيل بتعيين أي عنوان. إرجاع 0 عند النجاح أو != 0 عند الفشل.
يقوم UDP.Connect(Socket socket, ref Address address)
بتوصيل مأخذ توصيل إلى عنوان. إرجاع 0 عند النجاح أو != 0 عند الفشل.
UDP.SetOption(Socket socket, int level, int optionName, ref int optionValue, int optionLength)
يعين القيمة الحالية لخيار المقبس المرتبط بالمقبس. يمكن استخدام هذه الوظيفة لتعيين الخيارات الخاصة بالنظام الأساسي والتي لم يتم تحديدها عند إنشاء مأخذ التوصيل بشكل افتراضي. إرجاع الحالة بالنتيجة.
UDP.GetOption(Socket socket, int level, int optionName, ref int optionValue, ref int optionLength)
يحصل على القيمة الحالية لخيار مأخذ التوصيل المرتبط بالمقبس. يجب ضبط طول قيمة الخيار مبدئيًا على الحجم المناسب. إرجاع الحالة بالنتيجة.
UDP.SetNonBlocking(Socket socket, bool shouldBlock)
يعين وضع الإدخال / الإخراج غير المحظور للمقبس. إرجاع الحالة بالنتيجة.
يقوم UDP.SetDontFragment(Socket socket)
بتعيين وضع عدم التجزئة للمقبس. إرجاع الحالة بالنتيجة.
يحدد UDP.Poll(Socket socket, long timeout)
حالة مأخذ التوصيل والانتظار إذا لزم الأمر. يمكن استخدام هذه الوظيفة للاستقبال الموجه نحو الاستعداد. يمكن تحديد معلمة المهلة بالمللي ثانية للتحكم في مدة الاستقصاء. إذا تم تحديد مهلة 0، ستعود هذه الوظيفة على الفور. إذا انتهت المهلة الزمنية فسوف يُرجع 0. إذا كان المقبس جاهزًا لاستقباله فسيُرجع 1. وإلا فسيُرجع <0 في حالة حدوث خطأ.
يرسل UDP.Send(Socket socket, ref Address address, byte[] buffer, int bufferLength)
رسالة إلى العنوان المحدد لجهاز الاستقبال. يمكن تعيين معلمة العنوان على IntPtr.Zero
إذا كان مأخذ التوصيل متصلاً بعنوان. يمكن استخدام مؤشر IntPtr
إلى المخزن المؤقت الأصلي بدلاً من مرجع إلى صفيف بايت. إرجاع إجمالي عدد البايتات المرسلة، والذي يمكن أن يكون أقل من العدد المشار إليه بواسطة طول المخزن المؤقت. وإلا، فإنه سيعود <0 إذا حدث خطأ.
UDP.Receive(Socket socket, ref Address address, byte[] buffer, int bufferLength)
يتلقى رسالة ويحصل على عنوان المرسل. يمكن تعيين معلمة العنوان على IntPtr.Zero
لتخطي الحصول على العنوان. يمكن استخدام مؤشر IntPtr
إلى المخزن المؤقت الأصلي بدلاً من مرجع إلى صفيف بايت. إرجاع إجمالي عدد البايتات المستلمة. وإلا، فإنه سيعود <0 إذا حدث خطأ.
UDP.GetAddress(Socket socket, ref Address address)
يحصل على عنوان من مأخذ توصيل مرتبط أو متصل. تعتبر هذه الوظيفة مفيدة بشكل خاص لتحديد الارتباط المحلي الذي تم تعيينه بواسطة نظام التشغيل. إرجاع الحالة بالنتيجة.
UDP.IsEqual(ref Address left, ref Address right)
يقارن عنوانين للمساواة. إرجاع الحالة بالنتيجة.
يقوم UDP.SetIP(ref Address address, string ip)
بتعيين عنوان IP. يمكن استخدام مؤشر IntPtr
بدلاً من السلسلة غير القابلة للتغيير. إرجاع الحالة بالنتيجة.
UDP.GetIP(ref Address address, StringBuilder ip, int ipLength)
يحصل على عنوان IP. يجب أن تكون سعة السلسلة القابلة للتغيير مساوية لحقل UDP.hostNameSize
الثابت. يمكن استخدام مؤشر IntPtr
بدلاً من السلسلة القابلة للتغيير. إرجاع الحالة بالنتيجة.
UDP.SetHostName(ref Address address, string name)
يعين اسم المضيف أو عنوان IP. يمكن استخدام مؤشر IntPtr
بدلاً من السلسلة غير القابلة للتغيير. إرجاع الحالة بالنتيجة.
يحاول UDP.GetHostName(ref Address address, StringBuilder name, int nameLength)
إجراء بحث عكسي من العنوان. يمكن استخدام مؤشر IntPtr
بدلاً من السلسلة القابلة للتغيير. إرجاع الحالة بالنتيجة.