Aracılığıyla paylaş


CSocketFile Sınıfı

CFile Windows Yuvaları aracılığıyla ağ üzerinden veri göndermek ve almak için kullanılan nesne.

Sözdizimi

class CSocketFile : public CFile

Üyeler

Ortak Oluşturucular

Ad Tanım
CSocketFile::CSocketFile Bir CSocketFile nesne oluşturur.

Açıklamalar

Nesneyi bu amaçla bir CSocket nesneye ekleyebilirsinizCSocketFile. Ayrıca, MFC serileştirmesi kullanarak veri göndermeyi CSocketFile ve almayı basitleştirmek için nesneyi bir CArchive nesneye ekleyebilir ve genellikle ekleyebilirsiniz.

Verileri seri hale getirmek (göndermek) için arşive eklersiniz ve bu da nesneye veri CSocket yazmak için üye işlevlerini çağırırCSocketFile. Verileri seri durumdan çıkarmak (almak) için arşivden ayıklarsınız. Bu, arşivin nesneden veri okumak için üye işlevlerini çağırmasına CSocketFileCSocket neden olur.

Bahşiş

Burada açıklandığı gibi kullanmanın CSocketFile yanı sıra, aynı ile CFileyapabileceğiniz gibi tek başına dosya nesnesi olarak da kullanabilirsiniz. Ayrıca, arşiv tabanlı MFC serileştirme işlevleriyle de kullanabilirsiniz CSocketFile . CSocketFile'nin tüm CFileişlevlerini desteklemediğinden, bazı varsayılan MFC serileştirme işlevleri ile CSocketFileuyumlu değildir. Bu özellikle sınıfı için CEditView geçerlidir. kullanarak bir nesneye CSocketFile eklenmiş bir CArchive nesne aracılığıyla verileri seri hale CEditView getirmeye çalışmamalısınız; bunun yerine kullanınCEditView::Serialize.CEditView::SerializeRaw SerializeRaw işlevi, dosya nesnesinin sahip olmayan gibi işlevleri Seekolmasını CSocketFile bekler.

ve CSocketile kullandığınızdaCArchive, istenen bayt miktarını bekleyen bir döngüye (tarafındanPumpMessages(FD_READ)) girildiği CSocket::Receive bir durumla CSocketFile karşılaşabilirsiniz. Bunun nedeni, Windows yuvalarının FD_READ bildirim başına yalnızca bir geri kazanma çağrısına izin vermeleri, ancak CSocketFileCSocket FD_READ başına birden çok geri kazanma çağrısına izin vermeleridir. Okunacak veri olmadığında bir FD_READ alırsanız uygulama yanıt vermemeye başlar. Başka bir FD_READ alamazsanız, uygulama yuva üzerinden iletişim kurmayı durdurur.

Bu sorunu aşağıdaki gibi çözebilirsiniz. OnReceive Yuva sınıfınızın yönteminde, yuvadan okunacak beklenen veriler bir TCP paketinin boyutunu (genellikle en az 1096 bayt) aştığında ileti sınıfınızın yöntemini çağırmadan Serialize önce çağırınCAsyncSocket::IOCtl(FIONREAD, ...). Kullanılabilir verilerin boyutu gerekenden azsa, tüm verilerin alınmasını bekleyin ve yalnızca okuma işlemini başlatın.

Aşağıdaki örnekte, m_dwExpected kullanıcının almayı beklediği yaklaşık bayt sayısıdır. Kodunuzda başka bir yerde bildirdiğiniz varsayılır.

void CChatSocket::OnReceive(int nErrorCode)
{
   CSocket::OnReceive(nErrorCode);

   DWORD dwReceived;

   if (IOCtl(FIONREAD, &dwReceived))
   {
      if (dwReceived >= m_dwExpected) // Process only if you have enough data
         m_pDoc->ProcessPendingRead();
   }
   else
   {
      // Error handling here
   }
}

Daha fazla bilgi için bkz. MFC'de Windows Yuvaları, Windows Yuvaları: Yuvaları Arşivlerle Kullanma ve Windows Yuvaları 2 API'sini kullanma.

Devralma Hiyerarşisi

Cobject

Cfile

CSocketFile

Gereksinimler

Üst bilgi: afxsock.h

CSocketFile::CSocketFile

Bir CSocketFile nesne oluşturur.

explicit CSocketFile(
    CSocket* pSocket,
    BOOL bArchiveCompatible = TRUE);

Parametreler

pSocket
Nesneye iliştirmek için CSocketFile yuva.

bArchiveCompatible
Dosya nesnesinin bir CArchive nesneyle kullanılmak üzere olup olmadığını belirtir. YANLIŞ'ı CSocketFile yalnızca nesneyi belirli sınırlamalarla tek başına bir nesne gibi tek başına CFile kullanmak istiyorsanız geçirin. Bu bayrak, nesneye eklenen nesnenin CArchiveCSocketFile okuma için arabelleği yönetme biçimini değiştirir.

Açıklamalar

Nesne kapsam dışına çıktığında veya silindiğinde nesnenin yok edicisi yuva nesnesinden ayrılmıştır.

Dekont

bir CSocketFile nesnesi olmadan CArchive (sınırlı) dosya olarak da kullanılabilir. Varsayılan olarak, oluşturucunun CSocketFilebArchiveCompatible 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 veya ortak bir kaynağı 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. CArchive::IsBufferEmpty işlevi, böyle bir durumda arşivin arabelleğinin durumunu izlemek için kullanışlıdır.

kullanımı CSocketFilehakkında daha fazla bilgi için Windows Yuvaları: Yuvaları Arşivlerle Kullanma ve Windows Yuvaları: Arşivleri Kullanan Yuva Örneği makalelerine bakın.

Ayrıca bkz.

CFile Sınıfı
Hiyerarşi Grafiği
CAsyncSocket Sınıfı
CSocket Sınıfı