اللغة: C++ مع الغراء المنطقي Lua.
تم اختبار الكود لتجميعه وتشغيله على Ubuntu x86 وUbuntu x86_64 وGentoo x86_64 مع مراعاة استخدام الإصدار المناسب من LuaJIT. تعديلات على libjansson لإزالة التنسيق الإجباري للعوامات ذات .0 بعد إجراء الأعداد الصحيحة لدعم "الأعداد الصحيحة" بشكل صحيح ولا يزال هناك تحويل تلقائي من Lua، الذي يدعم الزوجي فقط.
كما أنه يتم تجميعه أيضًا على Ubuntu 12.04 LTS x86_64، نظرًا لأنه تم إنشاء libjansson وgoogle-glog يدويًا.
لواجيت
ليبيف
evhttpclient
google-glog
google-perftools (tcmalloc) - اختياري مع تعديلات طفيفة على المصدر والملف التعريفي
libjansson
Hireis
libicu - راجع مدير الحزم المحلي
حليقة - راجع مدير الحزم المحلي
Boost - اختياري إذا قمت باستبدال المؤشرات المتطفلة بشيء خاص بك.
من المحتمل أن تكون هناك حاجة لإجراء تعديلات على src/Makefile لتعكس مجلدات التثبيت الخاصة بك. يتم الترحيب بنظام بناء أكثر قوة، ولكن لم يكن مطلوبًا في وقت كتابة المشروع. (كميك؟)
لقد تعلمت (@zwagoth) شيئًا هنا: قم دائمًا بإبداء التعليقات في وقت الكتابة. وللتعويض عن ذلك سأقوم بتوثيق البنية الأساسية للبرنامج للمساعدة في الفهم.
الاعتذار عن الفوضى في قاعدة التعليمات البرمجية. كان هذا أيضًا أحد مشاريعي الأولى في لغة C++ بأي حجم وتعقيد.
يحتوي على كل المنطق الأساسي تقريبًا لمعالجة رسائل رسائل البروتوكول ورسائل RTB والعديد من عمليات الاسترجاعات الأساسية للأحداث مثل الاتصال وقطع الاتصال.
يحتوي الملف على جداول للوظائف المجهولة التي تم تسميتها حسب الأحداث التي تعالجها. يجب ألا يخزن هذا الملف أي حالة ويعتبر منطقة تخزين منطقية فقط. التصميم الأساسي لهذا الملف هو السماح بمنطق الغراء دون إجبار Lua على القيام بأي حمل ثقيل وتقليل كمية البيانات التي يتم نقلها من وإلى Lua على حساب المزيد من استدعاءات الوظائف إلى C++.
هناك أربعة جداول تم إدخالها في مساحة اسم الملف العامة بأسماء قصيرة لسهولة الكتابة:
u
: وظائف الاتصال/الشخصية (المستخدم).
s
: وظائف الخادم/الحالة العامة
c
: وظائف حالة القناة
const
: معرفات الأخطاء والقيم الثابتة
تقبل وظائف رد اتصال البروتوكول معلمتين، الاتصال الذي يرتبط به الأمر، ونسخة جدول من وسيطات json المتوفرة.
الاتصالات عبارة عن أرقام غير شفافة ويجب عدم تعديلها بأي شكل من الأشكال. تغيير قيمة الاتصال غير آمن. لقد تم تحذيرك.
ملف lua يحتوي على متغيرات التكوين المستخدمة أثناء بدء تشغيل برنامج الدردشة الخفي وتشغيله.
خادم سياسة فلاش أضيق الحدود. إذا كنت بحاجة إلى دعم Flash، فهذا هو ما تقوم بتشغيله. قم بتخصيص السياسة المضمنة حسب احتياجاتك.
نقطة دخول البرنامج يتعامل مع تهيئة خيوط الخلفية والضفيرة.
يفعل الكثير من الأشياء. يبدأ تدفق التعليمات البرمجية في Server::run()
.
تدفق الاتصال كما يلي:
listenCallback handshakeCallback connectionWriteCallback connectionReadCallback connectionwriteCallback
يقوم listenCallback
بإعداد معالجات أحداث الاتصال ويمرر التدفق إلى...
handshakeCallback
، الذي يعالج عمليات قراءة مصافحات websocket.
يعالج connectionWriteCallback
عندما يكون الاتصال جاهزًا للكتابة عليه ويتم تمكينه عندما تكون العناصر في قائمة الانتظار المراد كتابتها إلى الاتصال. يعالج التخزين المؤقت.
يعالج connectionReadCallback
كافة أحداث القراءة عند انتهاء مرحلة المصافحة. يتم تحليل البروتوكول بالكامل هنا ويتم إرسال الأوامر وتشغيلها من داخل هذه الوظيفة.
يعالج pingCallback
إرسال أحداث ping إلى العملاء. إذا تم تغيير البروتوكول، فيجب أن يكون هذا أحد أول الأشياء التي يجب تغييرها.
يتم تشغيل connectionTimerCallback
بشكل دوري ويتحقق مما إذا كان الاتصال ميتًا وينظفه.
runLuaEvent
هو سحر نيوت. أيضًا حيث يحدث السحر لكل أمر. هذا هو المكان الذي ينتقل فيه كل أمر إلى كود Lua من كود C++. يتعامل مع جميع حالات Lua ورد الاتصال للتأكد من عدم وقوع Lua في حلقة لا نهائية. يعالج خطأ الطباعة من داخل Lua.
يقوم هذا الملف بتخزين جميع بيانات الحالة المتعلقة بالقنوات والاتصالات والحظر والإشراف.
يتم تقسيم الاتصالات بين محددة وغير محددة لأن أسماء الشخصيات غير معروفة حتى يتحقق خادم تسجيل الدخول من وجودها ولإبقائها خارج مجموعة الأحرف التي يمكن البحث عنها بالاسم.
يعالج حفظ واستعادة الحالة إلى القرص.
يعمل كموضوع في الخلفية يعالج طلبات تسجيل الدخول والردود ويمررها مرة أخرى إلى الموضوع الرئيسي.
نظام تسجيل الدخول المتسلسل، يستخدم قائمة انتظار تسجيل الدخول العالمية. يمكن تحسين هذا قليلاً.
قد يكون التحويل إلى curl_multi أمرًا رائعًا، ولكنه يتضمن بعض التفاعل الممتع مع libev أو الكثير من الاستطلاعات العمياء. يجب أن تكون قوائم الانتظار مقفلة قبل الوصول إليها، وذلك بسبب الترابط.
فئة القناة الأساسية، تحافظ على بيانات الحالة الخاصة بالقناة طوال عمرها. تحدث جميع الإجراءات ذات المستوى المنخفض المتعلقة بالقنوات في هذا الملف من خلال الخطافات في Lua. عادةً ما يتم تغليفه بمؤشر متطفل لإدارة عمر المثيل.
هذا هو المكان الذي يحدث فيه تسلسل القنوات وإلغاء تسلسلها من json.
يتعامل مع كافة شبكات الاتصال وتصحيح حالات Lua.
يحافظ على قوائم العقد والحالة ورسالة الحالة والجنس.
يحافظ على قائمة التجاهل والأصدقاء.
مقابض لكل خنق الاتصال.
هذا هو المكان الذي يحدث فيه التخزين المؤقت لبيانات الإخراج.
يتم تمريرها بشكل عام باستخدام مؤشرات متطفلة لإدارة عمر المثيل.
يحتفظ بقائمة داخلية تضم القنوات التي تم ضمها. يجب أن يظل هذا متزامنًا مع قائمة مستخدمي القناة الفعلية.
هذا الملف محجوز للوظائف القليلة التي تتطلب سرعة أولية بدلاً من أن تكون قابلة للتخصيص. يتعامل مع أمر تسجيل الدخول ( IDN
). يتعامل مع أمر التصحيح ( ZZZ
). يتعامل مع أمر البحث ( FKS
).
جميع أوامر مجمع Lua التي تندرج ضمن الفئة s
في ملفات Lua.
جميع أوامر مجمع Lua التي تندرج ضمن فئة u
في ملفات Lua.
جميع أوامر مجمع Lua التي تندرج ضمن الفئة c
في ملفات Lua.
جميع قيم غلاف Lua التي تندرج ضمن فئة const
في ملفات Lua.
رسائل الخطأ والتعريفات.
استخدم وحدات الماكرو المحددة للتحقق من الخطأ والنوع! هذه هي الطريقة الوحيدة لمنع التعطل إذا تم تمرير النوع غير الصحيح كبيانات خفيفة إلى إحدى الوظائف بشكل غير متوقع.
تأكد من موازنة مكدس Lua الخاص بك. لقد حاولت جاهدة التأكد من صحة هذا الأمر، ولكن من السهل ارتكاب الأخطاء.
تجنب إعادة الجداول إلى كود Lua، فهي مكلفة في الإنشاء وغالبًا ما يكون لها إطار زمني قصير للاستخدام. استخدم الحكم الأفضل للموازنة بين تكلفة استدعاءات الوظائف وتكلفة بناء الجداول.
تجنب تمرير السلاسل إلى Lua دون داع. يمكن أن يكون مكلفًا بسبب نسخ الذاكرة.
إساءة استخدام Lua لقبول قيم الإرجاع المتعددة كميزة أصلية. انظر أعلاه ملاحظتين.
يعالج الدفع فقط موضوع redis. عبارة عن غلاف صغير حول أوامر redis وقيم الإرجاع الخاصة بها.
يستخدم قائمة انتظار الإدخال لتلقي الأوامر. يتم تشغيل الأوامر بطريقة دورية وليس لها ضمان الموثوقية. يمكن تعطيله، ويتجاهل الإدخال عند تعطيله.
يعمل gdb بشكل جيد لتصحيح أخطاء هذا التطبيق. من المفترض أن يساعد تعطيل tcmalloc وقسم JIT في LuaJIT بشكل كبير في تصحيح الأخطاء (يمكن أن يخفي tcmalloc بعض تلف الكومة البسيط).
أدوات ملفات تعريف الذاكرة في tcmalloc رائعة جدًا. راجع وثائق tcmalloc لمزيد من المعلومات حول كيفية استخدامه.