Partager via


Windows Sockets : Exemple de sockets utilisation des archives

Cet article présente un exemple de classe CSocketd'utilisation.L'exemple utilise des objets d' CArchive pour sérialiser des données via un socket.Notez que ce n'est pas sérialisation de document dans ou à partir d'un fichier.

L'exemple suivant montre comment vous utilisez l'archive pour envoyer et recevoir des données par l'intermédiaire de objets d' CSocket .L'exemple est conçu afin que deux instances échanger des données d'application (sur le même ordinateur ou sur d'autres ordinateurs du réseau).Une instance envoie les données, que l'autre instance reçoit et accepte.L'un ou l'autre application peut initialiser un échange, et l'un ou l'autre peut jouer le rôle de serveur ou en tant que client à l'autre application.La fonction suivante est définie dans la classe d'affichage de l'application :

void PacketSerialize(long nPackets, CArchive& arData, CArchive& arAck)
{
   BYTE bValue = 0;
   WORD nCopies = 0;

    if (arData.IsStoring())
    {
        CString strText;
        errno_t err;
        unsigned int number;

        for(int p = 0; p < nPackets; p++)
        {
            err = rand_s(&number);
            // if (err == 0)...
            bValue = (BYTE)(number%256);

            err = rand_s(&number);
            // if (err == 0)...
            nCopies = (WORD)(number%32000);

            // Send header information
            arData << bValue << nCopies;
            for(int c = 0; c < nCopies; c++)
            {
                // Send data
                arData << bValue;
            }

            strText.Format(_T("Sender sent packet %d of %d (Value = %d, Copies = %d)"),
            p + 1, nPackets, (int)bValue, nCopies);

            // Send receipt string
            arData << strText;
            arData.Flush();

            // Receive acknowledgment
            arAck >> strText;
            // display it
            DisplayMessage(strText);
        }
    }
    else
    {
        CString strText;
        BYTE bCheck;

        for(int p = 0; p < nPackets; p++)
        {
            // Receive header information
            arData >> bCheck >> nCopies;
            for(int c = 0; c < nCopies; c++)
            {
                // Receive data
                arData >> bValue;
                if (bCheck != bValue)
            {
               AfxMessageBox(_T("Packet Failure"));
            }
         }

         // Receive receipt string and display it
         arData >> strText;
         DisplayMessage(strText);

         strText.Format(_T("Recipient received packet %d of %d (Value = %d, Copies = %d)"), 
            p + 1, nPackets, (int)bValue, nCopies);

         // Send acknowledgment
         arAck << strText;
         arAck.Flush();
      }
    }
}

Le plus important sur cet exemple est que ses parallèles de structure que MFC Serialize fonctionnez.La fonction membre de PacketSerialize comprend une instruction de if avec une clause d' else .La fonction accepte deux références de CArchive comme paramètres : arData et arAck.Si l'objet archive d' arData est défini pour l'enregistrement (source), la branche de if exécute ; sinon, si arData est défini pour le chargement (recevoir) la fonction prend la branche d' else .Pour plus d'informations sur la sérialisation dans MFC, consultez sérialisation.

[!REMARQUE]

Il est supposé que l'objet archive d' arAck est le contraire d' arData.Si arData est pour l'émission, arAck reçoit, et l'inverse est true.

Pour envoyer, l'exemple de fonction boucle pour un nombre spécifié de fois, chaque génération fois des données aléatoires à des fins de démonstration.Votre application en possède des données réelles d'une certaine source, telle qu'un fichier.l'opérateur d'insertion de l'archive d' arData (<<) est utilisé pour envoyer un flux de données de trois segments consécutifs des données :

  • Un « en-tête » qui spécifie la nature des données (dans ce cas, la valeur de la variable d' bValue et le nombre de copies doivent être envoyées).

    Les deux éléments sont générés aléatoirement pour cet exemple.

  • Le nombre de copies spécifié des données.

    La boucle interne de for envoie bValue le nombre de fois spécifié.

  • Une chaîne est appelé strText que le récepteur affiche à son utilisateur.

Pour accepter, la fonction fonctionne de la même façon, mais qu'elle utilise l'opérateur d'extraction de l'archive (>>) pour obtenir des données de l'archive.L'application de réception doit vérifier les données qu'elle reçoit, affiche la dernière « a reçu » le message, puis renvoie un message indiquant « envoyé » pour application émettrice de s'afficher.

Dans cette les communications du, le mot « les ont reçu », le message présente la variable d' strText , est pour l'affichage à l'autre extrémité de la communication, elle spécifie à l'utilisateur de réception un nombre illimité de paquets de données ont été envoyés.Le récepteur répond à une chaîne semblable qui indique « envoyé », pour l'affichage sur l'écran d'origine de l'expéditeur.La réception des deux chaînes indique que la communication réussie s'est produite.

Mise en gardeAttention

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.Un exemple dans l'article Windows Sockets : L'ordre d'octet montre une communication de ce type.

Pour plus d'informations, consultez la spécification Windows Sockets : htonl, htons, ntohl, ntohs.En outre, pour plus d'informations, consultez :

Voir aussi

Référence

CArchive::IsStoring

CArchive::operator <<

CArchive::operator >>

CArchive::Flush

CObject::Serialize

Concepts

Windows Sockets dans MFC