Alternativen mit Beispiel-Server Quelle in c ++ winsock2
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
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.
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 .