Windows Sockets: Příklady soketů využívajících archivy
Tento článek představuje příklad použití třídy CSocket. Příklad používá CArchive
objekty k serializaci dat prostřednictvím soketu. Všimněte si, že toto není dokument serializace do nebo ze souboru.
Následující příklad ukazuje, jak pomocí archivu odesílat a přijímat data prostřednictvím CSocket
objektů. Příklad je navržený tak, aby si dvě instance aplikace (na stejném počítači nebo na různých počítačích v síti) vyměňovaly data. Jedna instance odesílá data, která druhá instance přijímá a uznává. Aplikace může zahájit výměnu a může fungovat jako server nebo jako klient druhé aplikace. Následující funkce je definována ve třídě zobrazení aplikace:
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();
}
}
}
Nejdůležitější věcí v tomto příkladu je, že jeho struktura paralelně paralelně funkce MFC Serialize
. Členová PacketSerialize
funkce se skládá z if
příkazu s klauzulí else
. Funkce přijímá dva odkazy CArchive jako parametry: arData a arAck. Pokud je archivní objekt arData nastaven pro ukládání (odesílání), if
větev se spustí; jinak pokud je arData nastavena pro načtení (příjem), funkce převezme else
větev. Další informace o serializaci v prostředí MFC naleznete v tématu Serializace.
Poznámka
Objekt archivu arAck se předpokládá, že je opakem arData. Pokud je arData pro odesílání, arAck přijímá a naopak je true.
Pro odeslání se ukázková smyčka funkce pro zadaný počet opakování pokaždé, když generuje nějaká náhodná data pro demonstrační účely. Vaše aplikace by získala skutečná data z nějakého zdroje, například ze souboru. Operátor vložení archivu arData (<<) slouží k odeslání datového proudu tří po sobě jdoucích bloků dat:
Hlavička, která určuje povahu dat (v tomto případě hodnota proměnné bValue a kolik kopií bude odesláno).
V tomto příkladu se vygenerují obě položky náhodně.
Zadaný počet kopií dat.
Vnitřní
for
smyčka odešle bValue zadaný početkrát.Řetězec s názvem strText , který příjemce zobrazí svému uživateli.
Pro příjem funguje funkce podobně s tím rozdílem, že k získání dat z archivu používá operátor extrakce archivu (>>). Přijímající aplikace ověří data, která obdrží, zobrazí konečnou zprávu Přijato a odešle zpět zprávu s textem "Odesláno", aby se zobrazila odesílaná aplikace.
V tomto komunikačním modelu je slovo "Přijato", zpráva odeslaná v proměnné strText , zobrazena na druhém konci komunikace, takže určuje přijímajícímu uživateli, že byl přijat určitý počet paketů dat. Příjemce odpoví podobným řetězcem s textem "Odesláno", aby se zobrazil na obrazovce původního odesílatele. Příjem obou řetězců znamená, že došlo k úspěšné komunikaci.
Upozornění
Pokud píšete klientský program MFC ke komunikaci se zavedenými servery (mimo MFC), neodesílejte objekty jazyka C++ prostřednictvím archivu. Pokud server není aplikace MFC, která rozumí typům objektů, které chcete odeslat, nebude moct přijímat a deserializovat objekty. Příklad v článku Windows Sockets: Pořadí bajtů ukazuje komunikaci tohoto typu.
Další informace naleznete v tématu Windows Sockets Specification: htonl, htons, ntohl, ntohs. Další informace najdete také tady:
Viz také
Windows Sockets v prostředí MFC
CArchive::IsStoring
CArchive::operator <<
CArchive::operator >>
CArchive::Flush
Objekt CObject::Serializace