Windows Sockets: Příklady soketů využívajících archivy
Tento článek obsahuje příklad použití třídy CSocket.V příkladu využívá CArchive objekty, které chcete serializovat data pomocí soketu.Všimněte si, že to není serializaci dokumentu do nebo ze souboru.
Následující příklad ukazuje, jak použít archiv pro odesílání a přijímání dat přes CSocket objekty.Příklad je navržen tak, aby dvě instance aplikace (ve stejném počítači nebo na různých počítačích v síti), vyměňovat data.Jedna instance odešle data, která v druhé instanci přijímá a uznává.Buď aplikace iniciovat výměnu a buď může fungovat jako server nebo klienta do jiné aplikace.V zobrazení třídy aplikace je definována následující funkce:
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();
}
}
}
Je velice důležité o tomto příkladu je její strukturu paralelní, knihovny MFC Serialize funkce.PacketSerialize členské funkce se skládá z -li výpis s jiný klauzule.Funkce přijímá dva CArchive odkazy jako parametry: arData a arAck.Pokud arData objekt archivu je nastaven pro ukládání (odeslání), -li provede pobočky; jinak, pokud arData je nastaven pro načtení (příjem) funkce přijímá jinak větev.Další informace o serializace v knihovně MFC naleznete v tématu serializace.
[!POZNÁMKA]
arAck Objekt archivu předpokládá se, že je opakem arData.Pokud arData je určena pro odesílání, arAck obdrží, a platí konverzace.
Pro odesílání, například funkce smyčky pro zadaným počtem opakování, při každém generování některé náhodná data pro demonstrační účely.Aplikace by získat skutečná data z nějakého zdroje, například souboru.arData Operátor vkládání archivu (<<) se používá pro odesílání proudu tří po sobě jdoucích bloky dat:
"header", který určuje druh dat (v tomto případě hodnotu bValue proměnné a kolik kopií budou odeslány).
Obě položky jsou náhodně generovány v tomto příkladu.
Zadaný počet kopií dat.
Vnitřní pro smyčka pošle bValue zadaným počtem opakování.
Řetězec pojmenovaný strText přijímač zobrazující jeho uživateli.
Pro příjem, funkce funguje podobně, s tím rozdílem, že používá operátor extrakci archivu (>>) Chcete-li získat data z archivu.Přijímající aplikace ověří data přijímá, zobrazí zprávu "Přijato" konečné a potom odešle zpět zprávu, která říká "Odesláno" odesílající aplikace k zobrazení.
V tomto modelu komunikace slovem "Přijato" zpráva odeslána strText proměnná, je pro zobrazení na druhém konci komunikace, tak určuje přijímající uživateli počet paketů dat byly přijaty.Příjemce odpoví podobně jako řetězec, který říká "Odeslat", pro zobrazení na obrazovce původnímu odesílateli.Přijetí obou řetězců označuje, že došlo k úspěšné komunikaci.
Upozornění |
---|
Pokud vytváříte aplikace MFC klienta pro komunikaci se servery zjištěné (non-MFC), neodesílejte objektů jazyka C++ do archivu.Pokud je server aplikace knihovny MFC, který rozumí typy objektů, které chcete odeslat, nebude moci přijímat a rekonstrukci objektů.Příklad v článku Windows Sockets: bajt pořadí ukazuje komunikaci tohoto typu. |
Další informace naleznete v tématu Windows Sockets specifikace: htonl, htons, ntohl, ntohs.Další informace naleznete také: