Windows Sockets: Beispiel für das Verwenden von Sockets mit Archiven
Dieser Artikel legt ein Beispiel der Anwendungsklasse CSocket. Das Beispiel setzt CArchive-Objekte, um Daten über einen Socket zu serialisieren. Beachten Sie, dass diese keine Dokumentserialisierung nach oder einer Datei.
Das folgende Beispiel veranschaulicht, wie Sie das Archiv verwenden, um Daten von CSocket-Objekte zu senden und zu empfangen. Das Beispiel ist damit zwei Instanzen der Daten der Anwendung (auf demselben Computer oder auf unterschiedlichen Computern im Netzwerk) vorgesehen. Eine Instanz sendet Daten, die die weitere Instanz empfängt und bestätigt. Jede Anwendung kann einem Austausch initiieren, und jede kann als Server oder Client als die andere Anwendung auftreten. Die folgende Funktion wird 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 über dieses Beispiel ist die Strukturähnlichkeiten, die von einem Serialize MFC Sie arbeiten. Die PacketSerialize-Memberfunktion besteht aus einer if-Anweisung mit einer else-Klausel. Die Funktion erhält CArchive zwei Verweise als Parameter: arData und arAck. Wenn das arData Archivobjekt zum Speichern (Senden) festgelegt ist, wird die if Verzweigung aus; andernfalls wenn arData für Laden (Empfangen) festgelegt wird verwendet die Funktion else Verzweigung. Weitere Informationen zur Serialisierung in MFC, finden Sie unter Serialisierung.
Hinweis
Das arAck Archivobjekt wird angenommen, dass das Gegenteil von arData.Wenn arData zum Senden ist, erhält arAck, und das Gegenteil gilt.
Für das Senden durchläuft die Beispielfunktion für eine angegebene Anzahl von Wiederholungen und jedes Mal generiert eine zufällige Daten für Demonstration, vorgesehen. die Anwendung würde echte Daten aus einer beliebigen Quelle, wie einer Datei abrufen. Der arData des Einfügungsoperator Archivs (<<) wird verwendet, um einen Stream aus drei aufeinander Blöcke von Daten zu senden:
Eine "Kopfzeile" die die Art der Daten angibt (in diesem Fall, der Wert der Variable bValue und viele Kopien bereitgestellt werden).
Beide Elemente werden nach dem Zufallsprinzip für dieses Beispiel generiert.
Die angegebene Anzahl von Kopien der Daten.
Die innere Schleife für sendet die bValue angegebene Anzahl Zeitangaben.
Eine Zeichenfolge namens strText, die der Empfänger zu dessen Benutzer anzeigt.
Für das Empfangen funktioniert die Funktion ähnlich, allerdings wird der Extraktionsoperator des Archivs (>>) können Daten aus dem Archiv abzurufen. Die empfangende Anwendung überprüft die Daten, die sie erhält, wird die "empfangene Meldung des endgültigen" an, und sendet dann eine Meldung zurück, die "übermittelt" besagt, sodass die sendende Anwendung angezeigt wird.
In diesem modelliert Kommunikation, das Wort, die Meldung ", die empfangen wird", die in der Variablen strText gesendet wird, ist für die Anzeige am anderen Ende der Kommunikation, sodass sie z empfangenden Benutzer an, dass verschiedene Pakete Daten empfangen wurden. Der Empfänger antwortet mit einer ähnlichen Zeichenfolge, die "übermittelt" besagt, für die Anzeige auf dem ersten Bildschirm des Absenders. Eingang beider Zeichenfolgen gibt an, dass eine erfolgreiche Kommunikation aufgetreten ist.
Warnung
Wenn Sie ein MFC-Clientprogramm schreiben, um mit den festgelegten (Nicht-MFC-) Servern zu kommunizieren, senden Sie C++-Objekte nicht durch das Archiv.Sofern, dass der Server eine MFC-Anwendung, die den Arten von Objekten, versteht Sie senden möchten, ist unklar, die Objekte zum Empfangen und zu deserialisieren.Ein Beispiel im Artikel Windows Sockets: Bytereihenfolge zeigt eine Kommunikation dieses Typs dargestellt.
Weitere Informationen finden Sie Socket-Spezifikation Windows: htonl, htons, ntohl, ntohs. Außerdem weitere Informationen, finden Sie unter: