Sdílet prostřednictvím


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.

Poznámka k upozornění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é:

Viz také

Referenční dokumentace

CArchive::IsStoring

CArchive::operator <<

CArchive::operator >>

CArchive::Flush

CObject::Serialize

Koncepty

Windows sockets v prostředí MFC