Windows Sockets : Utilisation des sockets avec des archives
Cet article explique modèle de programmation de CSocket.La classe CSocket assure la prise en charge de socket à un plus haut niveau d'abstraction que la classe CAsyncSocket.CSocket utilise une version du fournisseur de sérialisation MFC pour passer des données à partir d'un objet socket via un objet MFC CArchive .CSocket fournit le blocage (tout en gérant le traitement en arrière-plan des messages windows) et vous permet d'accéder à CArchive, qui gère de nombreux aspects de la communication que vous devez se faire à l'aide de l'API brute ou la classe CAsyncSocket.
Conseil |
---|
Vous pouvez utiliser la classe CSocket par lui-même, comme une version plus pratique d' CAsyncSocket, mais le modèle de programmation le plus simple est d'utiliser CSocket à un objet d' CArchive . |
Pour plus d'informations sur la façon dont l'implémentation des sockets avec des archives fonctionne, consultez Windows Sockets : comment les sockets avec des archives fonctionnent.Par exemple de code, consultez Windows Sockets : Ordre des opérations et Windows Sockets : Exemple de sockets utilisation des archives.Pour plus d'informations sur certaines fonctionnalités que vous pouvez obtenir en dérivant vos propres classes des classes de sockets, consultez Windows Sockets : dérivation des classes de sockets.
[!REMARQUE]
Si vous écrivez un programme client MFC pour communiquer avec les serveurs (non-MFC) générés, n'envoyez pas les objets C++ via l'archive.À moins que le serveur est une application MFC qui inclut les genres d'objets que vous souhaitez les envoyer, il ne peut pas recevoir et désérialiser vos objets.Pour le matériel relatif sur la de la communication avec les applications non-MFC, consultez également l'article Windows Sockets : L'ordre d'octet.
Le modèle de programmation de CSocket
À l'aide de CSocket un objet implique la création et associer ensemble plusieurs objets de classe MFC.Dans la procédure générale ci-dessous, chaque mesure est occupée par le socket de serveur et le client socket, à l'exception de l'étape 3, dans laquelle chaque type de douille requiert une action différente.
Conseil |
---|
Au moment de l'exécution, l'application serveur est généralement d'abord qu'prête et « écoutante » lorsque l'application cliente trouve une connexion.Si le serveur n'est pas prêt lorsque essaie de client à vous connecter, nécessitent généralement l'application utilisateur d'essayer se connecter à nouveau ultérieurement. |
Pour configurer la communication entre un socket de serveur et un socket client
Construisez un objet de CSocket .
Utilisez l'objet pour créer le handle sous-jacent de SOCKET .
Pour un objet client d' CSocket , vous devez normalement utiliser les paramètres par défaut à Create, à moins que vous ayez besoin d'un socket datagramme.Pour un objet serveur d' CSocket , vous devez spécifier un port dans l'appel de Créer .
[!REMARQUE]
CArchive ne fonctionne pas avec les sockets datagramme.Si vous souhaitez utiliser CSocket pour un socket datagramme, vous devez utiliser la classe comme vous utiliseriez CAsyncSocket, c. autrement dit., sans archive.Étant donné que les datagrammes sont non fiables (non assuré d'archiver et peut être répétée ou hors séquence), ils ne sont pas compatibles avec la sérialisation via une archive.Vous vous attendez à ce qu'une opération de sérialisation se termine de manière fiable et dans l'ordre.Si vous essayez d'utiliser CSocket à un objet d' CArchive pour un datagramme, une assertion MFC échoue.
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, l'appel CAsyncSocket::Listen pour démarrer le écoute connectent les tentatives d'un client.Lors de la réception d'une demande de connexion, recevez-la en appelant CAsyncSocket::Accept.
[!REMARQUE]
La fonction membre de Accepter se réfère à un nouveau, vide objet d' CSocket comme paramètre.Vous devez construire cet objet avant d'appeler Accepter.Si cet objet socket est hors de portée, la connexion se ferme.n'appelez pas Créer pour ce nouvel objet socket.
Créez un objet de CSocketFile , associant l'objet d' CSocket avec lui.
Créez un objet de CArchive de chargement (recevoir) ou stocker des données (d'émission).L'archive est associé à l'objet d' CSocketFile .
N'oubliez pas qu' CArchive ne fonctionne pas avec les sockets datagramme.
Utilisez l'objet d' CArchive de passer des données entre les sockets de client et serveur.
N'oubliez pas qu'un objet donné d' CArchive déplace les données dans un seul sens : pour charger (recevoir) ou l'enregistrement (source).Dans certains cas, vous utiliserez deux objets d' CArchive : un pour envoyer des données, l'autre pour recevoir des accusés de réception.
Après avoir reçu une connexion et installation de l'archive, vous pouvez effectuer des tâches telles que la validation des mots de passe.
Supprimez l'archive, le fichier de socket, les objets et sockets layer).
[!REMARQUE]
La classe CArchive fournit la fonction membre d' IsBufferEmpty spécifiquement pour la classe CSocket.Si la mémoire tampon contient plusieurs messages de données, par exemple, vous devez effectuer une boucle jusqu'à ce que tous soient lus et la mémoire tampon est désactivée.Sinon, votre notification suivante qu'il existe des données à accepter peut être différée indéfiniment.Utilisez IsBufferEmpty pour vous assurer de récupérer toutes les données.
L'article Windows Sockets : Ordre des opérations présente les deux côtés de ce processus avec l'exemple de code.
Pour plus d'informations, consultez :