Question

J'utilise cet exemple d'implémentation disponible à l'adresse http: // tangentsoft. net / wskfaq / examples / basics / select-server.html

Cela fait presque tout ce dont j'ai besoin, gère les connexions sans blocage et fonctionne dans son thread (ne crée pas de nouveau thread pour chaque connexion comme le font certains exemples), mais je suis inquiet car on m'a dit à winsock ne supportera que 64 connexions client max: S

Ces 64 connexions sont-elles vraies?

Quels autres choix ai-je? Ce serait bien d’avoir un exemple c ++ pour une implémentation similaire.

Merci

Était-ce utile?

La solution

Bibliothèque alternative:

Vous devriez envisager d'utiliser boost asio . Il s’agit d’une bibliothèque de réseaux multiplateformes qui simplifie de nombreuses tâches.

Vous pouvez trouver le exemple de code source que vous recherchez. ici .

À propos de la limite de 64:

Il n’existe aucune limite de connexion matérielle que vous rencontrerez avec un bon design. En gros, si vous utilisez un type de modèle de threading, vous ne rencontrerez pas cette limitation.

Voici quelques informations sur la limite dont vous avez entendu parler:

  

4.9 - Que sont les "64 sockets"? limitations?

     

Il existe deux limitations pour les sockets 64:

     

Le mécanisme d’événement Win32 (par exemple,   WaitForMultipleObjects ()) ne peut que   attendre 64 objets d’événement à la fois.   Winsock 2 fournit le   WSAEventSelect () qui permet   vous utilisez le mécanisme d'événement de Win32 pour   attendre les événements sur les sockets. Parce qu'il   utilise le mécanisme d'événement de Win32, vous pouvez   attendre que des événements sur 64 sockets à   un temps. Si vous voulez attendre plus   que 64 objets événement Winsock à un   temps, vous devez utiliser plusieurs   fils, chacun n'attendant pas plus de   64 des sockets.

     

La fonction select () est également limitée   dans certaines situations, attendre 64   prises à la fois. Le FD_SETSIZE   constante définie dans winsock.h   détermine la taille du fd_set   structures que vous passez à select (). Ses   défini par défaut à 64. Vous pouvez   définir cette constante à une valeur supérieure   avant de #include winsock.h, et   cela remplacera la valeur par défaut.   Malheureusement, au moins un   pile non Microsoft Winsock et certains   Les fournisseurs de services en couches assument la   défaut de 64; ils vont ignorer   prises au-delà de la 64e en plus grand   fd_sets.

     

Vous pouvez écrire un programme de test pour essayer   ceci sur les systèmes que vous prévoyez   soutenir, pour voir si elles ne sont pas   limité. S'ils le sont, vous pouvez obtenir   autour de cela avec des fils, tout comme vous   serait avec des objets d'événement.

Source

Autres conseils

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

vers l'OP:

Pourquoi ne voudriez-vous pas utiliser winsock2? Vous pouvez essayer de construire votre propre serveur en utilisant IOCP, bien que rendre cette plate-forme multi-plateforme soit un peu délicat. Vous pouvez consulter Boost :: asio comme suggéré par Brian.

Avant de décider que vous avez besoin d ’'alternatives à winsock2 " Veuillez lire ceci: Programmation réseau pour Microsoft Windows .

En résumé, vous n'avez PAS besoin d'une 'alternative à Winsock2', vous devez comprendre comment utiliser les modèles de programmation fournis pour donner pleinement effet à la plate-forme que vous ciblez. Ensuite, si vous avez vraiment besoin du code de sockets multi-plateformes qui utilise des E / S asynchrones, examinez ASIO, mais si vous n'avez pas vraiment besoin multipliez les codes de plate-forme par la suite, puis considérez quelque chose qui se concentre réellement sur les problèmes que vous pourriez rencontrer sur la plate-forme sur laquelle vous devez vous concentrer, c'est-à-dire quelque chose de spécifique à Windows. Retournez au livre mentionné ci-dessus et jetez un coup d'œil aux différentes options que vous avez.

L’option la plus performante et évolutive consiste à utiliser les ports d’achèvement IO. J'ai un code gratuit disponible sur ici , ce qui le rend joli facile à écrire sur un serveur évolutif et performant sur une plate-forme Windows (NT); la page liée contient également des liens vers des articles que j'ai écrits à ce sujet. Une comparaison de mon framework à ASIO peut être trouvée ici: http://www.lenholgate.com/blog/2008/09/how-does-the-socket-server-framework-compare-to-boostasio.html .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top