Freigeben über


Windows Sockets: Beispiel für Sockets mithilfe der Archive

In diesem Artikel wird ein Beispiel für die Anwendung vor CSocket- Klasse.Im Beispiel wird CArchive-Objekte, um Daten von einem Socket zu serialisieren.Beachten Sie, dass dadurch nicht die Dokumentserialisierung zu bzw. aus einer Datei befindet.

Das folgende Beispiel zeigt, wie Sie das Archiv verwenden, um Daten nach CSocket-Objekte zu senden und zu empfangen.Im Beispiel wird damit zwei Instanzen der Daten der Anwendung (auf demselben Computer oder auf verschiedenen Computern im Netzwerk) entworfen.Eine Instanz, die Daten sendet die andere Instanz empfängt und bestätigt.Jede Anwendung kann einen Austausch initiieren, und jede kann als Server oder Client zur anderen Anwendung auftreten.Die folgende Funktion ist in der Ansichtsklasse der Anwendung definiert:

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();
      }
    }
}

Die wichtigste Aufgabe auf diesem Beispiel ist, dass ihre Struktur ähnlichkeiten, die von einem MFC Serialize Sie arbeiten.Die PacketSerialize-Memberfunktion besteht aus einer if-Anweisung mit einer else-Klausel.Die Funktion erhält als Verweise CArchive zwei Parameter: arData und arAck.Wenn das arData Archiv Objekt zum Speichern (Submit) festgelegt ist, wird die if Verzweigung aus. Wenn arData für Laden (empfangen) festgelegt ist, setzt die Funktion die else Verzweigung.Weitere Informationen über die Serialisierung in MFC finden Sie unter Serialisierung.

HinweisHinweis

Das Objekt arAck Archiv wird davon ausgegangen, dass das Gegenteil von arData sein.Wenn arData zum Senden ist, empfängt arAck, und das Gegenteil gilt.

Für das Senden wird die Beispielfunktion für eine angegebene Anzahl von Wiederholungen und jedes Mal generiert eine Reihe von Zufallsdaten Beispielcode für zwecke.Ihre Anwendung würden echte Daten aus einer Quelle, z. B. einer Datei abgerufen.Der Operator zum Einfügen des arData Archivs (<<) wird verwendet, um einen Datenstrom mit drei aufeinander folgender Ausschnitten von Daten zu senden:

  • Ein "Header" der die Art der Daten angibt (in diesem Fall der Wert der bValue-Variablen und wie viele Kopien gesendet wurden).

    Beide Elemente werden nach dem Zufallsprinzip für dieses Beispiel generiert.

  • Die angegebene Anzahl von Kopien der Daten.

    Die innere Schleife for sendet bValue die angegebene Anzahl der Vorkommen.

  • Eine Zeichenfolge mit strText an, das der Empfänger auf den Benutzer angezeigt werden.

Für das Empfangen funktioniert die Funktion ähnlich, außer dass sie Extraktions des Archivs verwendet den Operator (>>), um Daten aus dem Archiv abzurufen.Die empfangende Anwendung überprüft die Daten, die diese empfängt, wird die Meldung" empfangene "des Schlusses an, und sendet dann eine Nachricht zurück, die "übermittelt" für die sendende Anwendung für die Anzeige zu lesen ist.

Diesbezüglich Kommunikation von Modellen, die das Wort ", "Nachricht empfangen wird, die in der" strText-Variable übertragen wird, ist für die Anzeige am anderen Ende der Kommunikation, sodass sie dem empfangenden Benutzer an, dass mehrere Pakete Daten empfangen wurden.Der Empfänger antwortet mit einer ähnlichen Zeichenfolge, die "übermittelt" lautet, für die Anzeige auf dem Bildschirm des Absenders.Eingang beider Zeichenfolgen gibt an, dass die erfolgreiche Kommunikation erfolgt ist.

WarnhinweisVorsicht

Wenn Sie ein MFC-Clientprogramm schreiben, um mit eingerichteten (MFC-fremde) Servern zu kommunizieren, senden Sie C++-Objekte nicht durch das Archiv.Sofern der Server eine MFC-Anwendung, die die Arten von Objekten versteht, Sie senden möchten, ist es nicht möglich, die Objekte zu empfangen bzw. zu deserialisieren.Ein Beispiel hierfür im Artikel Windows-Sockets: Bytereihenfolge wird eine Kommunikation dieses Typs an.

Weitere Informationen finden Sie unter Windows Socket-Spezifikation: htonl, htons, ntohl, ntohs.Darüber hinaus weitere Informationen finden Sie unter:

Siehe auch

Referenz

CArchive::IsStoring

CArchive::operator <<

CArchive::operator >>

CArchive::Flush

CObject::Serialize

Konzepte

Windows Sockets in MFC