4 Stimmen

alternativen zu winsock2 mit beispiel server source in c++

Ich verwende diese Beispielimplementierung, die Sie unter http://tangentsoft.net/wskfaq/examples/basics/select-server.html

Dies tut das meiste, was ich brauche, behandelt Verbindungen ohne zu blockieren und tut alle Arbeit in seinem Thread (nicht einen neuen Thread für jede Verbindung erstellen, wie einige Beispiele tun), aber ich bin besorgt, da mir gesagt wurde, dass Winsock nur max 64 Client-Verbindungen unterstützen wird: S

Sind diese 64 Verbindungen wahr?

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

Gracias

6voto

Brian R. Bondy Punkte 325712

Alternative Bibliothek:

Sie sollten Folgendes in Betracht ziehen Asio erhöhen . Es handelt sich um eine plattformübergreifende Netzwerkbibliothek, die viele der anfallenden Aufgaben vereinfacht.

Sie finden die Beispiel-Quellcode, den Sie hier suchen .


Über die 64er-Grenze:

Es gibt keine feste 64er-Verbindungsgrenze, die Sie bei einem guten Design erleben werden. Wenn Sie eine Art von Threading-Modell verwenden, werden Sie diese Einschränkung nicht erleben.

Hier finden Sie einige Informationen über den Grenzwert, von dem Sie gehört haben:

4.9 - Was sind die Grenzen der "64 Steckdosen"?

Es gibt zwei 64-Sockel-Beschränkungen:

Der Win32-Ereignismechanismus (z.B. WaitForMultipleObjects()) kann nur nur auf 64 Ereignisobjekte gleichzeitig warten. Winsock 2 bietet die WSAEventSelect() Funktion, mit der Win32-Ereignis-Mechanismus verwenden können, um auf Ereignisse auf Sockets zu warten. Da die Funktion Win32-Ereignis-Mechanismus verwendet, können Sie nur auf Ereignisse für 64 Sockets gleichzeitig warten gleichzeitig warten. Wenn Sie auf mehr warten wollen als 64 Winsock-Ereignisobjekte gleichzeitig warten wollen, müssen Sie mehrere Threads verwenden, die jeweils auf nicht mehr als 64 der Sockets warten.

Die Funktion select() ist ebenfalls eingeschränkt in bestimmten Situationen auf 64 Sockets gleichzeitig Sockets gleichzeitig zu warten. Die FD_SETSIZE Konstante, definiert in winsock.h definiert ist, bestimmt die Größe der fd_set Strukturen, die Sie an select() übergeben. Sie ist standardmäßig auf 64 definiert. Sie können diese Konstante auf einen höheren Wert setzen bevor Sie #include winsock.h einbinden, und dies wird den Standardwert überschreiben. Leider ist mindestens ein Nicht-Microsoft-Winsock-Stack und einige Layered Service Providers den Standardwert Standardwert von 64 an; sie ignorieren Sockets jenseits der 64. in größeren fd_sets.

Sie können ein Testprogramm schreiben, um zu versuchen auf den Systemen, die Sie unterstützen wollen zu unterstützen, um zu sehen, ob sie nicht eingeschränkt sind. Wenn dies der Fall ist, können Sie mit Threads umgehen, genauso wie Sie wie bei Ereignisobjekten.

Quelle

2voto

Daniel Sloof Punkte 12298

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

An den Auftraggeber:

Warum sollten Sie winsock2 nicht verwenden wollen? Sie könnten versuchen, Ihren eigenen Server mit IOCP zu bauen, obwohl das plattformübergreifend ein wenig schwierig ist. Sie könnten sich Boost::asio ansehen, wie Brian vorgeschlagen hat.

0 Stimmen

Woher stammt dieser Code? Wann wählen Sie bei mehr als 64 Verbindungen? Sie sollten stattdessen ein Threading-Modell verwenden, damit Sie das nicht tun müssen.

0 Stimmen

Dieser Code ist von: tangentsoft.net/wskfaq/beispiele/basics/select-server.cpp Sie finden sie auf der Seite, auf die OP verlinkt.

1voto

Len Holgate Punkte 20590

Bevor Sie entscheiden, dass Sie "Alternativen zu winsock2" benötigen, lesen Sie bitte dies: Netzwerkprogrammierung für Microsoft Windows .

Zusammenfassend lässt sich sagen, dass Sie KEINE "Alternative zu Winsock2" benötigen. Sie müssen wissen, wie Sie die mitgelieferten Programmiermodelle auf der von Ihnen angestrebten Plattform optimal nutzen können. Wenn Sie dann wirklich brauchen plattformübergreifenden Socket-Code, der async I/O verwendet, dann schauen Sie sich ASIO an, aber wenn Sie nicht wirklich brauchen Wenn Sie einen plattformübergreifenden Code suchen, sollten Sie sich etwas überlegen, das sich auf die Probleme konzentriert, die Sie auf der Plattform haben, auf die Sie sich konzentrieren müssen - also etwas Windows-spezifisches. Gehen Sie zurück zu dem oben erwähnten Buch und schauen Sie sich die verschiedenen Optionen an, die Sie haben.

Die leistungsfähigste und skalierbarste Option ist die Verwendung von IO Completion Ports. Ich habe einigen freien Code zur Verfügung von aquí das es ziemlich einfach macht, einen Server zu schreiben, der auf einer Windows (NT) basierten Plattform gut skaliert und funktioniert; die verlinkte Seite verweist auch auf einige Artikel, die ich darüber geschrieben habe. Ein Vergleich meines Frameworks mit ASIO kann hier gefunden werden: http://www.lenholgate.com/blog/2008/09/how-does-the-socket-server-framework-compare-to-boostasio.html .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X