Aracılığıyla paylaş


Windows Yuvaları: Yuvaların Arşivlerle Çalışması

Bu makalede, Bir CSocket nesnesinin, CSocketFile nesnesinin ve CArchive nesnesinin Windows Yuvası üzerinden veri göndermeyi ve almayı basitleştirmek için nasıl birleştirildiği açıklanmaktadır.

Windows Sockets: Example of Sockets Using Archives makalesi PacketSerialize işlevi sunar. Örnekteki PacketSerialize arşiv nesnesi, MFC SeriLeştirme işlevine geçirilen bir arşiv nesnesi gibi çalışır. Önemli fark, yuvalar için arşivin standart bir CFile nesnesine (genellikle bir disk dosyasıyla ilişkili) değil bir CSocketFile nesneye iliştirilmiş olmasıdır. Nesne, CSocketFile disk dosyasına bağlanmak yerine bir CSocket nesneye bağlanır.

Nesne CArchive bir arabelleği yönetir. Depolama (gönderme) arşivinin arabelleği dolduğunda, ilişkili CFile bir nesne arabelleğin içeriğini yazar. Yuvaya bağlı bir arşivin arabelleğinin boşaltılması, ileti göndermeye eşdeğerdir. Yükleme (alma) arşivinin arabelleği dolduğunda, CFile arabellek yeniden kullanılabilir olana kadar nesne okumayı durdurur.

sınıfı CSocketFile öğesinden CFiletüretilir, ancak konumlandırma işlevleri (, , SetLengthvb.), kilitleme işlevleri (LockRangeSeek, GetLengthUnlockRange) veya GetPosition işlev gibi CFile üye işlevlerini desteklemez. CSocketFile nesnesinin yapması gereken tek şey, ilişkili CSocket nesneye bayt dizisi yazmak veya bunları okumaktır. Bir dosya söz konusu olmadığından ve gibi Seek GetPosition işlemler mantıklı değildir. CSocketFile öğesinden CFiletüretilir, bu nedenle normalde bu üye işlevlerin tümünü devralır. Bunu önlemek için desteklenmeyen CFile üye işlevleri geçersiz kılınarak CSocketFile CNotSupportedException oluşturulur.

CSocketFile nesnesi, veri göndermek veya almak için nesnesinin CSocket üye işlevlerini çağırır.

Aşağıdaki şekilde, iletişimin her iki tarafındaki bu nesneler arasındaki ilişkiler gösterilmektedir.

CArchive, CSocketFile, and CSocket.
CArchive, CSocketFile ve CSocket

Bu karmaşıklığın amacı, sizi yuvanın ayrıntılarını kendiniz yönetme zorunluluğundan korumaktır. Yuvayı, dosyayı ve arşivi oluşturur ve ardından verileri arşive ekleyerek veya arşivden ayıklayarak göndermeye veya almaya başlarsınız. CArchive, CSocketFile ve CSocket arka planda ayrıntıları yönetir.

Nesne CSocket aslında iki durumlu bir nesnedir: bazen zaman uyumsuz (normal durum) ve bazen zaman uyumlu. Bir yuva, zaman uyumsuz durumunda çerçeveden zaman uyumsuz bildirimler alabilir. Ancak, veri alma veya gönderme gibi bir işlem sırasında yuva zaman uyumlu hale gelir. Bu, zaman uyumlu işlem tamamlanana kadar yuvanın başka zaman uyumsuz bildirim alamayacağı anlamına gelir. Modlar geçtiğinden, örneğin aşağıdakine benzer bir şey yapabilirsiniz:

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

      ar >> str;
   }
}

CSocket İki durumlu bir nesne olarak uygulanmadıysa, önceki bir bildirimi işlerken aynı olay türü için ek bildirimler almak mümkün olabilir. Örneğin, bir işlemi yaparken OnReceivebir OnReceive bildirim alabilirsiniz. Yukarıdaki kod parçasında arşivden ayıklama str özyinelemeye yol açabilir. Durum değiştirerek, CSocket ek bildirimleri engelleyerek özyinelemesi önler. Genel kural, bildirimler içinde bildirim yoktur.

Dekont

bir CSocketFile nesnesi olmadan CArchive (sınırlı) dosya olarak da kullanılabilir. Varsayılan olarak, oluşturucunun CSocketFile bArchiveCompatible parametresi TRUE'dır. Bu, dosya nesnesinin bir arşivle kullanılmak üzere olduğunu belirtir. Dosya nesnesini arşiv olmadan kullanmak için bArchiveCompatible parametresinde YANLIŞ'ı geçirin.

"Arşiv uyumlu" modunda bir CSocketFile nesne daha iyi performans sağlar ve "kilitlenme" tehlikesini azaltır. Hem gönderen hem de alan yuvalar birbirini beklerken veya ortak bir kaynak beklerken kilitlenme oluşur. Nesne bir nesneyle CSocketFile olduğu gibi çalıştıysa CArchive bu CFile durum oluşabilir. ile CFilearşiv, istenenden daha az bayt alırsa dosyanın sonuna ulaşıldığını varsayabilir. Bununla birlikte CSocketFile, veri ileti tabanlıdır; arabellek birden çok ileti içerebilir, bu nedenle istenen bayt sayısından daha az bilgi almak dosyanın sonu anlamına gelmez. Uygulama, ile olduğu CFilegibi bu durumda engellemez ve arabellek boş olana kadar arabellekten iletileri okumaya devam edebilir. içindeki CArchive IsBufferEmpty işlevi, böyle bir durumda arşivin arabelleğinin durumunu izlemek için kullanışlıdır.

Daha fazla bilgi için bkz . Windows Yuvaları: Yuvaları Arşivlerle Kullanma

Ayrıca bkz.

MFC'de Windows Yuvaları
CObject::Serialize