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
objet.
Création et utilisation d’un CAsyncSocket
Pour utiliser CAsyncSocket
Construisez un
CAsyncSocket
objet et utilisez l’objet pour créer le handle sous-jacentSOCKET
.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 unCAsyncSocket
segment sur le tas. Le premierCreate
appel ci-dessus utilise les paramètres par défaut pour créer un socket de flux. Le deuxièmeCreate
appel crée un socket de datagramme avec un port et une adresse spécifiés. (Vous pouvez utiliser l’une ou l’autreCreate
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) ouSOCK_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.
Si le socket est un client, connectez l’objet socket à un socket de serveur à l’aide
CAsyncSocket::Connect
de .-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 avecCAsyncSocket::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 videCSocket
comme paramètre. Vous devez construire cet objet avant d’appelerAccept
. Si cet objet socket est hors de portée, la connexion se ferme. N’appelezCreate
pas ce nouvel objet socket. Pour obtenir un exemple, consultez l’article Windows Sockets : Séquence d’opérations.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.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érateurdelete
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 :
- Windows Sockets : arrière-plan\
- Windows Sockets : sockets flux\
- Windows Sockets : sockets datagramme