Windows Sockets : comment les sockets avec des archives fonctionnent
Cet article explique comment un objet de CSocket , un objet de CSocketFile , et un objet de CArchive sont combinés pour simplifier l'émission et des données d'accepter via un Winsock.
L'article Windows Sockets : Exemple des sockets utilisation des archives répertorie la fonction de PacketSerialize .L'objet archive dans l'exemple de PacketSerialize fonctionne comme un objet archive passé à une fonction MFC sérialisez .La différence essentielle est celle des sockets, l'archive est jointe pas à un objet standard de fichier C (en général associé à un fichier sur disque) mais à un objet d' CSocketFile .Plutôt que de vous connecter à un fichier sur disque, l'objet d' CSocketFile connecte à CSocket un objet.
Un objet d' CArchive gère une mémoire tampon.Lorsque la mémoire tampon d'une archive s'stockage (d'émission) est complète, un objet associé d' CFile écrit le contenu de la mémoire tampon.Purger la mémoire tampon d'une archive jointe à un socket équivaut à envoyer un message.Lorsque la mémoire tampon d'une archive de chargement (recevoir) est complète, l'objet d' CFile arrête à lire jusqu'à ce qu'elle ne soit à nouveau disponible.
La classe CSocketFile dérive d' CFile, mais ne prend pas en charge les fonctions membres de fichier C telles que les fonctions de positionnement (Seek, GetLength, SetLength, etc.), le verrouillage s'exécute (LockRange, UnlockRange), ou la fonction d' GetPosition .Tout l'objet de CSocketFile doit faire consiste à écrire ou lire des séquences d'octets vers ou depuis l'objet associé d' CSocket .Étant donné qu'un fichier n'est pas appliqué, les opérations telles qu' Seek et l' GetPosition ne sont pas justifiée.CSocketFile est dérivé d' CFile, elle hériterait normalement toutes ces fonctions membres.Pour empêcher cela, les fonctions membres non prises en charge d' CFile sont substituées dans CSocketFile pour lever CNotSupportedException.
L'objet d' CSocketFile appelle les fonctions membres de l'objet d' CSocket pour envoyer ou recevoir des données.
L'illustration suivante montre les relations entre ces objets côté de la communication.
CArchive, CSocketFile, et CSocket
L'objectif de cette complexité notable est de vous protéger de le besoin de gérer les détails du socket vous-même.Vous créez le socket, le fichier, et l'archive, puis démarrez l'envoi ou des données d'accepter en l'insérant à l'archive ou en le récupérant de l'archive.CArchive, CSocketFile, et CSocket gèrent les détails en arrière-plan.
Un objet d' CSocket est en fait un objet de deux états : parfois asynchrone (l'état habituel) et parfois synchrone.Dans son état asynchrone, un socket peut recevoir des notifications asynchrones de l'infrastructure.Toutefois, lors d'une opération telle que accepter ou envoyer des données du socket devient synchrone.Cela signifie que le socket ne reçoit pas encore d'autres notifications asynchrones jusqu'à ce que l'exécution synchrone terminé.Étant donné qu'il bascule les modes, vous pouvez, par exemple, vous servir comme suit :
void CMySocket::OnReceive(int nErrorCode)
{
if (0 == nErrorCode)
{
CSocketFile file(this);
CArchive ar(&file, CArchive::load);
CString str;
ar >> str;
}
}
Si CSocket n'étaient pas implémentées en tant qu'objet de deux états, il est possible de recevoir des notifications supplémentaires pour le même type d'événement alors de traiter une notification précédente.Par exemple, vous pouvez obtenir une notification d' OnReceive pendant le traitement OnReceive.Dans le fragment de code ci-dessus, récupérer str de l'archive qui entraînera la récurrence.En basculant des rapports, CSocket empêché la récursivité en empêchant les notifications supplémentaires.La règle n'est pas de notification dans des notifications.
[!REMARQUE]
CSocketFile peut également être utilisé en tant que fichier (sandbox) d'un sans objet d' CArchive .Par défaut, le paramètre d' bArchiveCompatible du constructeur d' CSocketFile est TRUE.Cela spécifie que le fichier objet sert à une archive.Pour utiliser le fichier objet sans archive, exécutez FALSE dans le paramètre d' bArchiveCompatible .
Dans son mode compatible de « archive », un objet d' CSocketFile offre de meilleures performances et réduit le risque d'un « interblocage. » Un interblocage se produit lorsque l'émission et sockets de recevoir s'attendent mutuellement, ou en attente une ressource commune.Cette situation peut se produire si l'objet d' CArchive travaillé avec CSocketFile la façon dont elle applique à un objet d' CFile .Avec CFile, l'archive peut prendre que s'il reçoit moins octets qu'elle a demandé, la fin du fichier a été atteinte.Avec CSocketFile, toutefois, les données sont message basé ; la mémoire tampon peut contenir plusieurs messages, donc recevoir inférieur au nombre d'octets demandés n'implique pas de fin de fichier.L'application ne bloque pas dans ce cas comme elle peut avec CFile, et il peut continuer de lire les messages de la mémoire tampon jusqu'à ce qu'elle ne soit vide.La fonction d' IsBufferEmpty dans CArchive est utile pour surveiller l'état de la mémoire tampon de l'archive dans ce cas.
Pour plus d'informations, consultez Windows Sockets : Utilisation des sockets avec des archives