Partager via


Sockets Windows : utilisation de sockets avec archives

Cet article décrit le modèle de programmation CSocket. La classe CSocket fournit la prise en charge du socket à un niveau d’abstraction supérieur à celui de la classe CAsyncSocket. CSocket utilise une version du protocole de sérialisation MFC pour transmettre des données vers et depuis un objet socket via un objet CArchive MFC. CSocket fournit un blocage (tout en gérant le traitement en arrière-plan des messages Windows) et vous donne accès à CArchive, qui gère de nombreux aspects de la communication que vous devrez faire vous-même à l’aide de l’API ou de la classe CAsyncSocketbrute.

Conseil / Astuce

Vous pouvez utiliser la classe CSocket elle-même, comme une version plus pratique de , mais le modèle de CAsyncSocketprogrammation le plus simple consiste à utiliser CSocket avec un CArchive objet.

Pour plus d’informations sur le fonctionnement de l’implémentation de sockets avec des archives, consultez Windows Sockets : Fonctionnement des sockets avec archives. Pour obtenir un exemple de code, consultez Windows Sockets : séquence d’opérations et sockets Windows : exemple de sockets à l’aide d’archives. Pour plus d’informations sur certaines fonctionnalités que vous pouvez obtenir en dérivant vos propres classes à partir des classes sockets, consultez Windows Sockets : Dérivation de classes socket.

Remarque

Si vous écrivez un programme client MFC pour communiquer avec les serveurs établis (non MFC), n’envoyez pas d’objets C++ via l’archive. Sauf si le serveur est une application MFC qui comprend les types d’objets que vous souhaitez envoyer, il ne pourra pas recevoir et désérialiser vos objets. Pour des informations connexes sur le sujet de la communication avec des applications non MFC, consultez également l’article Windows Sockets : Byte Ordering.

Modèle de programmation CSocket

L’utilisation d’un CSocket objet implique la création et l’association de plusieurs objets de classe MFC. Dans la procédure générale ci-dessous, chaque étape est effectuée par le socket de serveur et le socket client, à l’exception de l’étape 3, dans laquelle chaque type de socket nécessite une action différente.

Conseil / Astuce

Au moment de l’exécution, l’application serveur commence généralement par être prête et « à l’écoute » lorsque l’application cliente recherche une connexion. Si le serveur n’est pas prêt lorsque le client tente de se connecter, vous devez généralement demander à l’application utilisateur de réessayer de se connecter ultérieurement.

Pour configurer la communication entre un socket de serveur et un socket client

  1. Construisez un objet CSocket .

  2. Utilisez l’objet pour créer le handle SOCKET sous-jacent.

    Pour un CSocket objet client, vous devez normalement utiliser les paramètres par défaut pour Créer, sauf si vous avez besoin d’un socket de datagramme. Pour un CSocket objet serveur, vous devez spécifier un port dans l’appel Create .

    Remarque

    CArchive ne fonctionne pas avec les sockets de datagramme. Si vous souhaitez utiliser CSocket pour un socket de datagramme, vous devez utiliser la classe comme vous l’utiliseriez CAsyncSocket, autrement dit, sans archive. Étant donné que les datagrammes ne sont pas fiables (non garantis pour arriver et peuvent être répétés ou hors séquence), ils ne sont pas compatibles avec la sérialisation via une archive. Vous prévoyez qu’une opération de sérialisation se termine de manière fiable et en séquence. Si vous essayez d’utiliser CSocket avec un CArchive objet pour un datagramme, une assertion MFC échoue.

  3. Si le socket est un client, appelez CAsyncSocket ::Connect pour connecter l’objet socket à un socket de serveur.

    - ou -

    Si le socket est un serveur, appelez CAsyncSocket ::Listen pour commencer à écouter les tentatives de connexion à partir d’un client. Lors de la réception d’une demande de connexion, acceptez-la en appelant CAsyncSocket ::Accept.

    Remarque

    La Accept fonction membre prend une référence à un nouvel objet vide CSocket comme paramètre. Vous devez construire cet objet avant d’appeler Accept. Si cet objet socket est hors de portée, la connexion se ferme. N’appelez Create pas ce nouvel objet socket.

  4. Créez un objet CSocketFile , en associant l’objet CSocket à celui-ci.

  5. Créez un objet CArchive pour le chargement (réception) ou le stockage (envoi) de données. L’archive est associée à l’objet CSocketFile .

    N’oubliez pas que CArchive cela ne fonctionne pas avec les sockets de datagramme.

  6. Utilisez l’objet CArchive pour transmettre des données entre les sockets client et serveur.

    N’oubliez pas qu’un objet donné CArchive déplace les données dans une direction uniquement : soit pour le chargement (réception) soit pour le stockage (envoi). Dans certains cas, vous allez utiliser deux CArchive objets : un pour l’envoi de données, l’autre pour recevoir des accusés de réception.

    Après avoir accepté une connexion et configuré l’archive, vous pouvez effectuer des tâches telles que la validation des mots de passe.

  7. Détruisez les objets d’archive, de fichier de socket et de socket.

    Remarque

    La classe CArchive fournit la IsBufferEmpty fonction membre spécifiquement pour une utilisation avec la classe CSocket. Si la mémoire tampon contient plusieurs messages de données, par exemple, vous devez effectuer une boucle jusqu’à ce qu’elles soient lues et que la mémoire tampon soit effacée. Sinon, votre prochaine notification indiquant qu’il y a des données à recevoir peut être retardée indéfiniment. Permet IsBufferEmpty de vous assurer que vous récupérez toutes les données.

L’article Windows Sockets : Séquence d’opérations illustre les deux côtés de ce processus avec un exemple de code.

Pour plus d’informations, consultez :

Voir aussi

Sockets de Windows dans MFC
CSocket ::Create