Sdílet prostřednictvím


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