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 CFile
türetilir, ancak konumlandırma işlevleri (, , SetLength
vb.), kilitleme işlevleri (LockRange
Seek
, GetLength
UnlockRange
) 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 CFile
tü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 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 OnReceive
bir 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 CFile
arş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 CFile
gibi 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