Windows Sockets : utilisation de la classe CAsyncSocket

Cet article explique comment utiliser la classe CAsyncSocket. Cette classe encapsule l’API Windows Sockets à un niveau très bas. CAsyncSocket est utilisé par les programmeurs qui connaissent les communications réseau en détail, mais veulent la commodité des rappels pour la notification des événements réseau. En fonction de cette hypothèse, cet article fournit uniquement des instructions de base. Vous devez probablement envisager d’utiliser CAsyncSocket si vous souhaitez que Windows Sockets traite facilement plusieurs protocoles réseau dans une application MFC, mais ne souhaitez pas sacrifier la flexibilité. Vous pouvez également sentir que vous pouvez obtenir une meilleure efficacité en programmant les communications plus directement vous-même que vous pourriez utiliser le modèle de remplacement plus général de classe CSocket.

CAsyncSocket est documenté dans la référence MFC. Visual C++ fournit également la spécification windows Sockets, située dans le Kit de développement logiciel (SDK) Windows. Les détails sont laissés à vous. Visual C++ ne fournit pas d’exemple d’application pour CAsyncSocket.

Si vous ne connaissez pas très bien les communications réseau et souhaitez une solution simple, utilisez une classe CSocket avec un CArchive objet. Pour plus d’informations, consultez Windows Sockets : Utilisation de sockets avec archives .

Cet article couvre les points suivants :

Création et utilisation d’un CAsyncSocket

Pour utiliser CAsyncSocket

  1. Construisez un CAsyncSocket objet et utilisez l’objet pour créer le handle sous-jacent SOCKET .

    La création d’un socket suit le modèle MFC de la construction en deux étapes.

    Par exemple :

    CAsyncSocket sock;
    sock.Create(); // Use the default parameters
    

    -ou-

    CAsyncSocket *pSocket = new CAsyncSocket;
    int nPort = 27;
    pSocket->Create(nPort, SOCK_DGRAM);
    

    Le premier constructeur ci-dessus crée un CAsyncSocket objet sur la pile. Le deuxième constructeur crée un CAsyncSocket segment sur le tas. Le premier Create appel ci-dessus utilise les paramètres par défaut pour créer un socket de flux. Le deuxième Create appel crée un socket de datagramme avec un port et une adresse spécifiés. (Vous pouvez utiliser l’une ou l’autre Create version avec l’une ou l’autre méthode de construction.)

    Les paramètres à définir Create sont les suivants :

    • Un « port » : entier court.

      Pour un socket de serveur, vous devez spécifier un port. Pour un socket client, vous acceptez généralement la valeur par défaut de ce paramètre, ce qui permet aux sockets Windows de sélectionner un port.

    • Type de socket : SOCK_STREAM (valeur par défaut) ou SOCK_DGRAM.

    • Une « adresse » de socket telle que "ftp.microsoft.com" ou "128.56.22.8".

      Il s’agit de votre adresse IP (Internet Protocol) sur le réseau. Vous allez probablement toujours compter sur la valeur par défaut de ce paramètre.

    Les termes « port » et « adresse de socket » sont expliqués dans Windows Sockets : ports et adresses de socket.

  2. Si le socket est un client, connectez l’objet socket à un socket de serveur à l’aide CAsyncSocket::Connectde .

    -ou-

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

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

    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. Pour obtenir un exemple, consultez l’article Windows Sockets : Séquence d’opérations.

  3. Effectuez des communications avec d’autres sockets en appelant les fonctions membres de l’objet CAsyncSocket qui encapsulent les fonctions de l’API Windows Sockets.

    Consultez la spécification et la classe CAsyncSocket Windows Sockets dans la référence MFC.

  4. Détruisez l’objet CAsyncSocket .

    Si vous avez créé l’objet socket sur la pile, son destructeur est appelé lorsque la fonction conteneur sort de l’étendue. Si vous avez créé l’objet socket sur le tas, à l’aide de l’opérateur new , vous êtes responsable de l’utilisation de l’opérateur delete pour détruire l’objet.

    Le destructeur appelle la fonction membre de l’objet Close avant de détruire l’objet.

Pour obtenir un exemple de cette séquence dans le code (en fait pour un CSocket objet), consultez Windows Sockets : Séquence d’opérations.

Vos responsabilités avec CAsyncSocket

Lorsque vous créez un objet de classe CAsyncSocket, l’objet encapsule un handle Windows SOCKET et fournit des opérations sur ce handle. Lorsque vous utilisez CAsyncSocket, vous devez traiter tous les problèmes que vous pouvez rencontrer si vous utilisez directement l’API. Par exemple :

  • Scénarios de « blocage ».

  • Différences d’ordre d’octet entre les machines d’envoi et de réception.

  • Conversion entre des chaînes de jeu de caractères Unicode et multioctets (Mo CS).

Pour obtenir des définitions de ces termes et des informations supplémentaires, consultez Windows Sockets : Blocage, Windows Sockets : Ordre d’octets, Sockets Windows : Conversion de chaînes.

Malgré ces problèmes, la classe CAsyncSocket peut être le bon choix pour vous si votre application nécessite toute la flexibilité et le contrôle que vous pouvez obtenir. Si ce n’est pas le cas, envisagez d’utiliser la classe CSocket à la place. CSocket masque de nombreux détails : il pompe les messages Windows pendant les appels bloquants et vous donne accès à CArchive, qui gère les différences d’ordre d’octet et la conversion de chaînes pour vous.

Pour en savoir plus, consultez :

Voir aussi

Windows Sockets dans MFC