Frage

Ich verwende dieses Beispiel-Implementierung unter http: // tangentsoft. net / wskfaq / examples / basics / select-server.html

Dies tut das meiste, was ich brauche, Griffe Verbindungen, ohne zu blockieren und macht alle Arbeiten in seinem Gewinde (nicht einen neuen Thread für jede Verbindung wie einige Beispiele zu tun zu schaffen), aber ich mache mir Sorgen, da ich winsock gesagt habe nur werden maximal 64 Client connectios unterstützen: S

Ist die 64 Verbindungen wahr?

Welche anderen Möglichkeiten habe ich? Es wäre cool, ein C ++ Beispiel für eine ähnliche Implementierung zu haben.

Danke

War es hilfreich?

Lösung

Alternative Bibliothek:

Sie sollten prüfen steigern Asio . Es ist eine Cross-Plattform-Netzwerk-Bibliothek, die viele Aufgaben vereinfachen Sie tun können müssen.

Sie finden das Beispiel-Quellcode Sie suchen hier .


über die 64 Grenze:

Es gibt kein hartes 64-Verbindungslimit, die Sie mit einem guten Design erleben. Grundsätzlich, wenn Sie irgendeine Art von Threading-Modell verwenden, werden Sie nicht diese Einschränkung erfahren.

Hier einige Informationen über die Grenze Sie gehört:

  

4.9 - Was sind die "64-Buchsen" Einschränkungen

     

Es gibt zwei 64-Buchse Einschränkungen:

     

Der Win32-Ereignismechanismus (z   WaitForMultipleObjects ()) kann nur   warte auf 64 Ereignisobjekte zu einem Zeitpunkt.   Winsock 2 stellt die   WSAEventSelect () Funktion, die ermöglicht   Sie verwenden Win32 Veranstaltung Mechanismus   für Veranstaltungen auf Steckdosen warten. Weil es   Win32 verwendet Ereignis Mechanismus, können Sie   nur für Veranstaltungen warten auf 64-Buchsen an   eine Zeit. Wenn Sie möchten, auf mehr warten   als 64 Winsock Ereignis an einem Objekt   Zeit, müssen Sie mehrere verwenden   Fäden, die jeweils wartet auf nicht mehr als   64 der Buchsen.

     

Die Funktion select () ist ebenfalls begrenzt   in bestimmten Situationen zu warten, auf 64   Steckdosen zu einem Zeitpunkt. die FD_SETSIZE   konstant in WINSOCK.H definiert   bestimmt die Größe des fd_set   Strukturen, die Sie (wählen) übergeben. Es ist   standardmäßig definiert bis 64 können Sie   definieren diese Konstante auf einen höheren Wert   bevor Sie # include winsock.h und   dies wird den Standardwert außer Kraft setzen.   Leider mindestens eine   Nicht-Microsoft Winsock-Stack und einige   Layered Service Provider übernimmt die   Standardwert von 64; sie werden ignoriert   Steckdosen über die 64th in größeren   fd_sets.

     

Sie können ein Testprogramm schreiben, um zu versuchen   diese auf den Systemen planen Sie auf   Unterstützung, um zu sehen, wenn sie es nicht sind   begrenzt. Wenn sie sind, können Sie sich   um diese mit Gewinde, wie Sie gerade   würde mit Ereignisobjekte.

Quelle

Andere Tipps

@ 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;
                }

Zum OP:

Warum würden Sie nicht wollen winsock2 benutzen? Sie könnten versuchen, auf den Aufbau Ihrer eigenen Server mit IOCP zu suchen, obwohl machen diese Cross-Plattform ein wenig schwierig ist. Sie könnten bei Boost-aussehen :: asio wie Brian vorgeschlagen.

Bevor Sie sich entscheiden, dass Sie Alternativen brauchen‘to winsock2" lesen Sie bitte: Network Programming für Microsoft Windows .

Zusammenfassend müssen Sie nicht eine ‚Alternative zu Winsock2‘ Sie müssen verstehen, wie die Programmiermodelle zur vollen Wirkung auf die Plattform geliefert verwenden, die Sie Targeting. Dann, wenn Sie wirklich Notwendigkeit Cross-Plattform-Steckdosen-Code, die Asynchron-I verwendet / O dann bei ASIO aussehen, aber, wenn Sie nicht tun wirklich braucht Cross-Plattform-Code dann etwas betrachten, die auf die Probleme konzentriert sich tatsächlich, dass Sie auf der Plattform haben könnte, die Sie konzentrieren sich auf brauchen - also etwas Fenster spezifisch. Zurück zum Buch oben erwähnt, und werfen Sie einen Blick auf die verschiedenen Möglichkeiten Sie haben.

Die performante und skalierbare Option ist IO Completion Ports zu verwenden. Ich habe einige verfügbaren freien Code von hier , dass es ziemlich macht leicht, einen Server zu schreiben, und führt auch auf ein Fenster (NT) basierte Plattform skaliert; die verknüpfte Seite auch Links zu einigen Artikeln, die ich darüber geschrieben habe. Ein Vergleich von meinem Rahmen ASIO finden Sie hier: http://www.lenholgate.com/blog/2008/09/how-does-the-socket-server-framework-compare-to-boostasio.html .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top