سؤال

أنا أستخدم هذا المثال للتنفيذ الموجود في http://tangentsoft.net/wskfaq/examples/basics/select-server.html

يؤدي هذا إلى تنفيذ معظم ما أحتاج إليه، ويتعامل مع الاتصالات دون حظر ويعمل كل شيء في سلسلة المحادثات الخاصة به (لا ينشئ سلسلة رسائل جديدة لكل اتصال كما تفعل بعض الأمثلة)، ولكنني أشعر بالقلق لأنه تم إخباري بأن Winsock سيدعم فقط الحد الأقصى لاتصالات العميل 64: S

هل هذا 64 اتصالاً صحيحًا؟

ما هي الخيارات الأخرى المتاحة لي؟سيكون من الرائع أن يكون لديك مثال c++ لتنفيذ مماثل.

شكرًا

هل كانت مفيدة؟

المحلول

المكتبة البديلة:

يجب أن تفكر في استخدام تعزيز اسيو.إنها مكتبة شبكات متعددة المنصات تعمل على تبسيط العديد من المهام التي قد يتعين عليك القيام بها.

يمكنك العثور على مثال على كود المصدر الذي تبحث عنه هنا.


حول الحد 64:

لا يوجد حد اتصال ثابت يبلغ 64 ستختبره مع التصميم الجيد.في الأساس، إذا كنت تستخدم نوعًا ما من نماذج الترابط، فلن تواجه هذا القيد.

إليك بعض المعلومات حول الحد الذي سمعت عنه:

4.9 - ما هي قيود "64 مأخذ توصيل"؟

هناك نوعان من قيود 64 مقبس:

آلية حدث Win32 (على سبيل المثال.لا يمكن للانتظار إلا على 64 كائن حدث في وقت واحد.يوفر Winsock 2 وظيفة WSAeventSelect () التي تتيح لك استخدام آلية حدث Win32 لانتظار الأحداث على مآخذ.نظرًا لأنه يستخدم آلية حدث Win32 ، يمكنك الانتظار فقط للأحداث على 64 مآخذ في وقت واحد.إذا كنت ترغب في الانتظار أكثر من 64 كائنات حدث Winsock في وقت واحد ، فأنت بحاجة إلى استخدام مؤشرات ترابط متعددة ، لا ينتظر كل منها أكثر من 64 مآخذ.

وظيفة SELECT () محدودة أيضًا في مواقف معينة للانتظار على 64 مآخذ في وقت واحد.يحدد ثابت FD_SetSize المحدد في Winsock.h حجم هياكل FD_SET التي تمررها لتحديد ().يتم تعريفه بشكل افتراضي إلى 64.يمكنك تحديد هذا الثابت إلى قيمة أعلى قبل أن تتولى #include winsock.h ، وسيؤدي ذلك إلى تجاوز القيمة الافتراضية.لسوء الحظ ، يفترض مكدس Winsock غير المتطابق على الأقل وبعض مقدمي الخدمات الطبقات الافتراضي 64 ؛سوف يتجاهلون مآخذ ما يتجاوز 64 في fd_sets الأكبر.

يمكنك كتابة برنامج اختبار لتجربة ذلك على الأنظمة التي تخطط لدعمها ، لمعرفة ما إذا كانت غير محدودة.إذا كانت كذلك ، فيمكنك الالتفاف على هذا الموضوع ، تمامًا كما تفعل مع كائنات الأحداث.

مصدر

نصائح أخرى

وBrian:

                if ((gConnections.size() + 1) > 64) {
                    // For the background on this check, see
                    // www.tangentsoft.net/wskfaq/advanced.html#64sockets
                    // The +1 is to account for the listener socket.
                    cout << "WARNING: More than 63 client "
                            "connections accepted.  This will not "
                            "work reliably on some Winsock "
                            "stacks!" << endl;
                }

لوOP:

وماذا كنت لا تريد استخدام كان Winsock2؟ هل يمكن أن نحاول أن ننظر إلى بناء الخادم الخاص بك باستخدام IOCP، على الرغم مما يجعل هذا عبر منصة صعبة قليلا. هل يمكن أن ننظر في تفعيل :: اسيو مثل براين المقترحة.

قبل أن تقرر أنك بحاجة إلى "بدائل لـ Winsock2"، يرجى قراءة هذا: برمجة الشبكات لمايكروسوفت ويندوز.

باختصار، لا تحتاج إلى "بديل لـ Winsock2"، بل تحتاج إلى فهم كيفية استخدام نماذج البرمجة المتوفرة لتحقيق التأثير الكامل على النظام الأساسي الذي تستهدفه.ثم، إذا كنت حقا يحتاج رمز مآخذ التوصيل عبر الأنظمة الأساسية الذي يستخدم الإدخال/الإخراج غير المتزامن، ثم انظر إلى ASIO، ولكن إذا لم تفعل ذلك بحاجة حقا التعليمات البرمجية عبر الأنظمة الأساسية، ثم فكر في شيء يركز فعليًا على المشكلات التي قد تواجهها على النظام الأساسي والتي تحتاج إلى التركيز عليها - على سبيل المثال.شيء محدد للنوافذ.ارجع إلى الكتاب المذكور أعلاه وألقِ نظرة على الخيارات المختلفة المتاحة لك.

الخيار الأكثر أداءً وقابلية للتطوير هو استخدام منافذ إكمال الإدخال والإخراج.لدي بعض التعليمات البرمجية المجانية المتاحة من هنا وهذا يجعل من السهل جدًا كتابة خادم يتوسع ويعمل بشكل جيد على نظام أساسي يستند إلى Windows (NT)؛ترتبط الصفحة المرتبطة أيضًا ببعض المقالات التي كتبتها حول هذا الموضوع.يمكن العثور على مقارنة بين إطار العمل الخاص بي وASIO هنا: http://www.lenholgate.com/blog/2008/09/how-does-the-socket-server-framework-compare-to-boostasio.html.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top