Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Important
Meilleures pratiques de Winsock modernes : suivez ces instructions pour le nouveau code :
-
Utilisez Winsock 2.2 : toujours demander la version 2.2 dans WSAStartup. Les fonctions Winsock 1.1 telles que
gethostbynamesont obsolètes et ne prennent pas en charge IPv6. -
Utiliser
getaddrinfopour la résolution de noms : la fonction getaddrinfo est indépendante du protocole (prend en charge IPv4 et IPv6). N’utilisez jamaisgethostbynameougethostbyaddr, qui sont obsolètes. -
Écrivez du code prêt pour IPv6 : utilisez-le
AF_UNSPECgetaddrinfopour que votre code fonctionne sur IPv4 et IPv6. Évitez de coderAF_INETen dur. Consultez le Guide IPv6 pour Winsock. -
Gérez l’initialisation avec RAII ( en C++, encapsulez
WSAStartup/WSACleanupune classe RAII ou utilisez un garde d’étendue pour garantir le nettoyage sur tous les chemins de sortie (exceptions, retours anticipés). - Préférez les E/S asynchrones : pour les applications serveur ou tout ce qui gère plusieurs connexions, utilisez des ports d’achèvement d’E/S (performances supérieures) ou des E/S superposées. Le blocage des sockets sur un thread d’interface utilisateur fige l’application.
- N’oubliez pas la gestion des erreurs : vérifiez les valeurs de retour de tous les appels Winsock et utilisez WSAGetLastError pour les diagnostics.
Erreurs courantes dans le code généré par l’IA : oubli WSAStartup avant tout appel de socket, utilisation gethostbyname au lieu de getaddrinfo, codage AF_INET en dur (IPv4 uniquement), utilisation de boucles bloquantes recv/senddans les threads d’interface utilisateur et non appel freeaddrinfo après .getaddrinfo
Cette section est un guide pas à pas pour bien démarrer avec la programmation de sockets Windows. Il est conçu pour fournir une compréhension des fonctions winsock de base et des structures de données, ainsi que leur fonctionnement ensemble.
L’application cliente et serveur que nous utilisons dans cette rubrique pour l’illustration est un client et un serveur très basiques. Des exemples de code plus avancés sont inclus dans les exemples inclus dans le kit de développement logiciel (SDK) Microsoft Windows.
Les premières étapes sont les mêmes pour les applications clientes et serveurs.
- À propos des serveurs et des clients
- Création d’une application Winsock de base
- Initialisation de Winsock
Les articles suivants décrivent les étapes restantes de création d’une application cliente Winsock.
- Création d’un socket pour le client
- Connexion à un socket
- Envoi et réception de données sur le client
- Déconnexion du client
Les articles suivants décrivent les étapes restantes de création d’une application serveur Winsock.
- Création d’un socket pour le serveur
- Associer un socket
- Écouter sur un socket
- Acceptation d’une connexion
- Réception et envoi de données sur le serveur
- Déconnexion du serveur
Code source complet pour ces exemples de base.
- Exécution de l’exemple de code client et serveur Winsock
- Terminer le code client Winsock
- Terminer le code du serveur Winsock
Exemples d’applications Winsock avancés
Plusieurs exemples d’applications client et serveur Winsock plus avancés sont disponibles sur GitHub. Ils sont répertoriés ici par ordre de performances décroissantes et se trouvent dans les répertoires suivants :
iocp
Ce dossier contient trois exemples de programmes qui utilisent des ports d’achèvement d’E/S. Les programmes incluent : un serveur Winsock,
iocpserverqui utilise la fonction WSAAccept ; un serveur Winsock,iocpserverexqui utilise la fonction AcceptEx ; et un client Winsock multithread simple,iocpclientutilisé pour tester l’un de ces serveurs.Les programmes serveur prennent en charge plusieurs clients se connectant à l’aide de TCP/IP et en envoyant des mémoires tampons de données arbitraires que le serveur renvoie ensuite au client. Par commodité, un programme client simple,
iocpclient, a été développé pour se connecter au serveur et lui envoyer continuellement des données afin de le mettre sous charge à l’aide de plusieurs threads. Les serveurs Winsock qui utilisent des ports d’achèvement d’E/S offrent les performances les plus élevées.Chevauchement
Ce dossier contient un exemple de programme serveur qui utilise des E/S superposées. L’exemple de programme utilise la fonction AcceptEx et les E/S superposées pour gérer efficacement plusieurs demandes de connexion asynchrones des clients. Le serveur utilise la fonction AcceptEx pour multiplexer différentes connexions clientes dans une application Win32 monothread. L’utilisation d’E/S superposées permet une plus grande scalabilité.
WSAPoll
Ce dossier contient un exemple de programme de base qui illustre l’utilisation de la fonction WSAPoll . Le programme client et serveur combiné ne bloque pas et utilise la fonction WSAPoll pour déterminer quand il est possible d’envoyer ou de recevoir sans blocage. Cet exemple est destiné à l’illustration et n’est pas un serveur hautes performances.
simple
Ce dossier contient trois exemples de programmes de base qui illustrent l’utilisation de plusieurs threads par un serveur. Les programmes incluent : un serveur TCP/UDP simple,
simples; un serveur TCP uniquement,simples_ioctlqui utilise la fonction select dans une application console Win32 pour prendre en charge plusieurs demandes clientes ; et un programme TCP/UDP client,simplecpour tester les serveurs. Les serveurs illustrent l’utilisation de plusieurs threads pour gérer plusieurs demandes clientes. Cette méthode présente des problèmes d’extensibilité, car un thread distinct est créé pour chaque demande cliente.accepter
Ce dossier contient un exemple de serveur et de programme client de base. Le serveur illustre l’utilisation de l’acceptation non bloquante à l’aide de la fonction select ou de l’acceptation asynchrone à l’aide de la fonction WSAAsyncSelect . Cet exemple est destiné à l’illustration et n’est pas un serveur hautes performances.