alternatives à winsock2 avec exemple de source de serveur en c ++
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
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.
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 .