Aracılığıyla paylaş


Windows Yuvaları: Arşivlerle Kullanılan Yuvalara Örnek

Bu makalede CSocket sınıfı kullanımına bir örnek verilmiştir. Örnek, bir yuva aracılığıyla verileri seri hale getirmek için nesneleri devreye CArchive alır. Bunun bir dosyaya veya dosyadan belge serileştirmesi olmadığını unutmayın.

Aşağıdaki örnekte, nesneler aracılığıyla CSocket veri göndermek ve almak için arşivi nasıl kullandığınız gösterilmektedir. Örnek, uygulamanın iki örneğinin (aynı makinede veya ağdaki farklı makinelerde) veri alışverişi için tasarlanmıştır. Bir örnek, diğer örneğin aldığı ve onayladığı verileri gönderir. Her iki uygulama da bir değişim başlatabilir ve sunucu veya diğer uygulamaya istemci olarak davranabilir. Aşağıdaki işlev uygulamanın görünüm sınıfında tanımlanır:

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();
      }
   }
}

Bu örnekle ilgili en önemli şey, yapısının bir MFC Serialize işlevininkiyle paralel olmasıdır. PacketSerialize member işlevi, yan tümcesi olan bir if else deyimden oluşur. işlevi parametre olarak iki CArchive başvurusu alır: arData ve arAck. arData arşiv nesnesi depolama (gönderme) if için ayarlandıysa dal yürütülür; aksi takdirde arData yüklenmek (almak) için ayarlandıysa işlev dalı alırelse. MFC'de serileştirme hakkında daha fazla bilgi için bkz . Serileştirme.

Dekont

arAck arşiv nesnesinin arData'nın tersi olduğu varsayılır. arData göndermek içinse, arAck alır ve ters true olur.

Göndermek için örnek işlev, gösterim amacıyla her seferinde rastgele veriler oluştururken belirli bir sayıda döngü oluşturur. Uygulamanız, dosya gibi bir kaynaktan gerçek veriler elde eder. ArData arşivinin ekleme işleci (<<), ardışık üç veri öbeklerinden oluşan bir akış göndermek için kullanılır:

  • Verilerin doğasını belirten bir "üst bilgi" (bu örnekte bValue değişkeninin değeri ve kaç kopya gönderileceği).

    Bu örnek için her iki öğe de rastgele oluşturulur.

  • Verilerin belirtilen kopya sayısı.

    İç for döngü, bValue değerini belirtilen sayıda gönderir.

  • Alıcının kullanıcısına görüntülediği strText adlı bir dize.

alma için işlevi, arşivden veri almak için arşivin ayıklama işlecini (>>) kullanması dışında benzer şekilde çalışır. Alıcı uygulama aldığı verileri doğrular, son "Alındı" iletisini görüntüler ve ardından gönderen uygulamanın görüntülenmesi için "Gönderildi" ifadesini içeren bir ileti gönderir.

Bu iletişim modelinde, strText değişkeninde gönderilen ileti olan "Alındı" sözcüğü, iletişimin diğer ucunda görüntülenecektir, bu nedenle alıcı kullanıcıya belirli sayıda veri paketi alındığını belirtir. Alıcı, özgün gönderenin ekranında görüntülenmesi için "Gönderildi" yazan benzer bir dizeyle yanıt verir. Her iki dizenin de alınması, başarılı bir iletişimin gerçekleştiğini gösterir.

Dikkat

Yerleşik (MFC olmayan) sunucularla iletişim kurmak için bir MFC istemci programı yazıyorsanız, C++ nesnelerini arşiv aracılığıyla göndermeyin. Sunucu göndermek istediğiniz nesne türlerini anlayan bir MFC uygulaması olmadığı sürece nesnelerinizi alamaz ve seri durumdan çıkaramaz. Windows Yuvaları: Bayt Sıralama makalesindeki bir örnek, bu tür bir iletişimi gösterir.

Daha fazla bilgi için bkz. Windows Yuva Belirtimi: htonl, htons, ntohl, ntohs. Ayrıca, daha fazla bilgi için bkz:

Ayrıca bkz.

MFC'de Windows Yuvaları
CArchive::IsStoring
CArchive::operator <<
CArchive::operator >>
CArchive::Flush
CObject::Serialize