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