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
Veri Akışı Adı | Açıklama |
---|---|
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 CSocketFile
CSocket
neden olur.
İpucu
Burada açıklandığı gibi kullanmanın CSocketFile
yanı sıra, aynı ile CFile
yapabileceğ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 CFile
işlevlerini desteklemediğinden, bazı varsayılan MFC serileştirme işlevleri ile CSocketFile
uyumlu 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 Seek
olmasını CSocketFile
bekler.
ve CSocket
ile 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 CSocketFile
CSocket
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
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 CArchive
CSocketFile
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.
Not
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 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 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. CArchive::IsBufferEmpty işlevi, böyle bir durumda arşivin arabelleğinin durumunu izlemek için kullanışlıdır.
kullanımı CSocketFile
hakkı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ı