Aracılığıyla paylaş


Windows Yuvaları: Yuva arşivleri ile nasıl çalışır?

Bu makalede açıklanmaktadır nasıl bir CSocket nesnesi, bir CSocketFile nesnesi ve bir CArchive nesnesini Windows yuva üzerinden veri gönderme ve alma basitleştirmek üzere birleştirilir.

Makale Windows Sockets: örnek, yuva kullanarak arşivleri sunan PacketSerialize işlevi.Arşiv nesnesinde PacketSerialize çok benzer bir mfc geçirilen bir arşiv nesnesi örneği çalışır Serialize işlevi.Yuva için bir standart olmayan arşiv bağlı önemli fark ise CFile (genellikle disk dosya ile ilişkili) nesne ancak çok bir CSocketFile nesnesi.Bir disk dosyasına bağlanmak yerine CSocketFile nesne bağlandığında bir CSocket nesnesi.

A CArchive nesnesi arabellek yönetir.Saklama (gönderen) arşiv arabelleği doluysa, ilişkilendirilmiş bir CFile dışında arabellek içeriği nesnesine yazar.Reçeteye bağlı bir yuvaya bir arşiv arabellek ileti gönderme için eşdeğerdir.Bir Arşiv yüklenirken (alma) arabellek dolduğunda, CFile nesne okuma arabelleği yeniden kullanılabilir duruma gelene kadar durur.

Sınıf CSocketFile türetildiği CFile, ancak desteklemediği CFile konumlandırma fonksiyonları gibi üye işlevler (Seek, GetLength, SetLength, vb.), kilitleme işlevleri (LockRange, UnlockRange), veya GetPosition işlevi.Tüm CSocketFile nesne gerekir yapmak için veya ilişkili bir bayt dizisi okuma ya da yazma CSocket nesnesi.Bir dosya söz konusu değil çünkü gibi işlemleri Seek ve GetPosition hiçbir anlamlı.CSocketFiletüretilir CFile, böylece onu normalde tüm bu üye işlevleri devralan.Bu, desteklenmeyen önlemek için CFile üye işlevleri de kılınır CSocketFile oluşturulacak bir CNotSupportedException.

CSocketFile Nesne üye işlevlerini çağıran, CSocket nesnesine veri gönderme veya alma.

Aşağıdaki şekilde, iletişimin iki tarafına bu nesneler arasında ilişki gösterilmektedir.

CArchive, CSocketFile ve CSocket

CArchive CSocketFile CSocket

Bu belirgin karmaşıklığı amacı kendinizi yuva ayrıntılarını yönetme elde etmenizi kalkanı sağlamaktır.Yuva, dosya ve arşiv oluşturmak ve daha sonra arşiv ekleme veya arşivinden ayıklama veri gönderen veya alan başlar.CArchive, CSocketFile, ve CSocket arka planda ayrıntılarını yönetme.

A CSocket aslında iki durumlu nesne nesnesidir: bazen zaman uyumsuz (genel durum) ve bazen eşzamanlı.Zaman uyumsuz durumda bir yuva, çerçevesinden eşzamansız bildirimler alabilirsiniz.Ancak, alma veya veri gönderme gibi bir işlem sırasında yuva zaman uyumlu olur.Bu eşzamanlı işlem tamamlanıncaya kadar yuva daha fazla zaman uyumsuz bildirim alacaksınız anlamına gelir.Modu geçiş nedeniyle, örneğin, aşağıdaki gibi yapabilirsiniz:

void CMySocket::OnReceive(int nErrorCode)
{
   if (0 == nErrorCode)
   {
      CSocketFile file(this);
      CArchive ar(&file, CArchive::load);
      CString str;

      ar >> str;
   }
}

CSocket Not implemented iki durumlu bir nesne olarak önceki bildirim işleme sırada olay aynı tür ek bildirimleri almak mümkün olabilir.Örneğin, alabilirsiniz bir OnReceive bildirim işlenirken bir OnReceive.Yukarıdaki kod parçasında ayıklanması str arşivden özyineleme neden olabilir.Durumları arasında geçiş tarafından CSocket ek bildirimler engelleyerek özyineleme engeller.Genel kural, hiçbir bildirim bildirimler içinde olur.

[!NOT]

A CSocketFile (sınırlı) dosyası olarak da kullanılan bir CArchive nesnesi.Varsayılan olarak, CSocketFile yapıcı'nın bArchiveCompatible parametresi doğru.Bu dosya nesnesine bir arşiv ile kullanmak için olduğunu belirtir.Geçişi olmadan bir arşiv dosyası nesne kullanmak için yanlış , bArchiveCompatible parametresi.

"Arşiv uyumlu" modunda, bir CSocketFile nesne daha iyi performans sağlar ve tehlike "kilitlenme.", azaltır Gönderen ve alan yuva bekleyen birbirine bağlı veya ortak bir kaynak için bekleyen kilitlenme oluşur.Bu durum ortaya çıkabilir CArchive nesne çalıştığınız CSocketFile bunu yapar şekilde bir CFile nesnesi.İle CFile, arşiv, istenenden daha az sayıda bayt alırsa, dosya sonuna ulaşıldı varsayalım.İle CSocketFile, ancak veri alarak; iletisidir Arabellek istenen bayt sayısından daha az alan dosya sonu gelmez böylece birden çok ileti içerir.Uygulama ile olabileceği gibi bu durumda engellemediği CFile, ve önbellek boşaltılana kadar ileti arabelleğinden okuma devam edebilirsiniz.IsBufferEmpty , işlev CArchive böyle bir durumda arşiv 's arabellek durumunu izlemek için yararlıdır.

Daha fazla bilgi için bkz: Windows Sockets: kullanarak yuva arşivleri ile

Ayrıca bkz.

Başvuru

CObject::Serialize

Kavramlar

mfc, Windows Sockets