CSocket
Sınıf
öğesinden CAsyncSocket
türetilir, Windows Yuvaları API'sinin kapsüllemesini devralır ve nesneninkinden daha yüksek bir CAsyncSocket
soyutlama düzeyini temsil eder.
Sözdizimi
class CSocket : public CAsyncSocket
Üyeler
Ortak Oluşturucular
Veri Akışı Adı | Açıklama |
---|---|
CSocket::CSocket |
Bir CSocket nesne oluşturur. |
Genel Yöntemler
Veri Akışı Adı | Açıklama |
---|---|
CSocket::Attach |
SOCKET Bir nesneye CSocket tanıtıcı ekler. |
CSocket::CancelBlockingCall |
Sürmekte olan bir engelleme çağrısını iptal eder. |
CSocket::Create |
Bir yuva oluşturur. |
CSocket::FromHandle |
Bir tanıtıcı verilip nesneye CSocket bir SOCKET işaretçi döndürür. |
CSocket::IsBlocking |
Bir engelleme çağrısının devam edip etmediğini belirler. |
Korumalı Yöntemler
Veri Akışı Adı | Açıklama |
---|---|
CSocket::OnMessagePending |
Engelleyici bir çağrının tamamlanmasını beklerken bekleyen iletileri işlemek için çağrılır. |
Açıklamalar
CSocket
sınıflarla CSocketFile
çalışır ve CArchive
verilerin gönderilmesini ve alınmasını yönetir.
Nesnesi CSocket
, zaman uyumlu işlemi CArchive
için gerekli olan engellemeyi de sağlar. , ReceiveFrom
SendTo
Send
, , ve Accept
(tümü öğesinden devralınanCAsyncSocket
) gibi Receive
engelleyici işlevler içinde CSocket
hata WSAEWOULDBLOCK
döndürmez. Bunun yerine, bu işlevler işlem tamamlanana kadar bekler. Ayrıca, bu işlevlerden biri engellenirken çağrılırsa CancelBlockingCall
özgün çağrı WSAEINTR hatasıyla sonlandırılır.
Nesne CSocket
kullanmak için oluşturucuyu çağırın ve ardından temel tanıtıcıyı SOCKET
oluşturmak için çağrısı Create
yapın (yazınSOCKET
). varsayılan parametreleri Create
bir akış yuvası oluşturur, ancak yuvayı bir CArchive
nesneyle kullanmıyorsanız, bunun yerine veri birimi yuvası oluşturmak için bir parametre belirtebilir veya sunucu yuvası oluşturmak için belirli bir bağlantı noktasına bağlayabilirsiniz. İstemci tarafında ve Accept
sunucu tarafında kullanarak Connect
bir istemci yuvasına bağlanın. Ardından bir CSocketFile
nesne oluşturun ve oluşturucudaki nesneyle ilişkilendirin CSocket
CSocketFile
. Ardından, göndermek için bir CArchive
nesne ve veri almak için (gerektiği gibi) bir nesne oluşturun, sonra bunları oluşturucudaki nesneyle CSocketFile
ilişkilendirin CArchive
. İletişim tamamlandığında , CSocketFile
ve CSocket
nesnelerini yok edinCArchive
. SOCKET
Veri türü Windows Yuvaları: Arka Plan makalesinde açıklanmıştır.
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 bildirim başına FD_READ
yalnızca bir geri kazanma çağrısına izin vermeleri, ancak CSocketFile
CSocket
her biri için FD_READ
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
uygulama 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
}
}
Not
Statik olarak bağlı bir MFC uygulamasında ikincil iş parçacıklarında MFC yuvalarını kullanırken, yuva kitaplıklarını başlatmak için yuvaları kullanan her iş parçacığını çağırmanız AfxSocketInit
gerekir. Varsayılan olarak, AfxSocketInit
yalnızca birincil iş parçacığında çağrılır.
Daha fazla bilgi için bkz. MFC'de Windows Yuvaları, Windows Yuvaları: Arşivlerle Yuvaları Kullanma, Windows Yuvaları: Arşivlerle Yuvalar Nasıl Çalışır, Windows Yuvaları: İşlem Dizisi, Windows Yuvaları: Arşivleri Kullanan Yuva Örnekleri.
Devralma Hiyerarşisi
CSocket
Gereksinimler
Üstbilgi: afxsock.h
CSocket::Attach
Tanıtıcıyı bir CSocket
nesneye eklemek için bu üye işlevini çağırınhSocket
.
BOOL Attach(SOCKET hSocket);
Parametreler
hSocket
Bir yuvanın tutamacını içerir.
Dönüş Değeri
İşlev başarılı olursa sıfır olmayan.
Açıklamalar
Tanıtıcı SOCKET
nesnenin m_hSocket
veri üyesinde depolanır.
Daha fazla bilgi için bkz . Windows Yuvaları: Yuvaları Arşivlerle Kullanma.
Örnek
class CSockThread : public CWinThread
{
public:
SOCKET m_hConnected;
protected:
CChatSocket m_sConnected;
// remainder of class declaration omitted.
BOOL CSockThread::InitInstance()
{
// Attach the socket object to the socket handle
// in the context of this thread.
m_sConnected.Attach(m_hConnected);
m_hConnected = NULL;
return TRUE;
}
// This listening socket has been constructed
// in the primary thread.
void CListeningSocket::OnAccept(int nErrorCode)
{
UNREFERENCED_PARAMETER(nErrorCode);
// This CSocket object is used just temporarily
// to accept the incoming connection.
CSocket sConnected;
Accept(sConnected);
// Start the other thread.
CSockThread *pSockThread = (CSockThread*)AfxBeginThread(
RUNTIME_CLASS(CSockThread), THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
if (NULL != pSockThread)
{
// Detach the newly accepted socket and save
// the SOCKET handle in our new thread object.
// After detaching it, it should no longer be
// used in the context of this thread.
pSockThread->m_hConnected = sConnected.Detach();
pSockThread->ResumeThread();
}
}
CSocket::CancelBlockingCall
Şu anda devam eden bir engelleme çağrısını iptal etmek için bu üye işlevini çağır.
void CancelBlockingCall();
Açıklamalar
Bu işlev, bu yuva için bekleyen engelleme işlemini iptal eder. Özgün engelleme çağrısı hatasıyla WSAEINTR
en kısa sürede sonlandırılır.
Engelleme Connect
işlemi söz konusu olduğunda, Windows Yuvaları uygulaması engelleme çağrısını mümkün olan en kısa sürede sonlandırır, ancak bağlantı tamamlanana (ve sonra sıfırlanana) veya zaman aşımına uğradıysa yuva kaynaklarının serbest bırakılması mümkün olmayabilir. Bu durum, yalnızca uygulama hemen yeni bir yuva açmayı (yuva yoksa) veya aynı eşe bağlanmayı denediğinde fark edilebilir.
dışında Accept
bir işlemi iptal etmek yuvayı belirsiz bir durumda bırakabilir. Bir uygulama bir yuvadaki engelleme işlemini iptal ederse, uygulamanın yuvada gerçekleştirebilmesine bağlı olabileceği tek işlem çağrısıdır Close
, ancak diğer işlemler bazı Windows Yuva uygulamaları üzerinde çalışabilir. Uygulamanız için maksimum taşınabilirlik istiyorsanız, iptalden sonra işlemleri gerçekleştirmeye bağımlı olmamaya dikkat etmelisiniz.
Daha fazla bilgi için bkz . Windows Yuvaları: Yuvaları Arşivlerle Kullanma.
CSocket::Create
Windows yuvasını Create
oluşturmak ve eklemek için bir yuva nesnesi oluşturduktan sonra üye işlevini çağırın.
BOOL Create(
UINT nSocketPort = 0,
int nSocketType = SOCK_STREAM,
LPCTSTR lpszSocketAddress = NULL);
Parametreler
nSocketPort
Yuvayla kullanılacak belirli bir bağlantı noktası veya MFC'nin bir bağlantı noktası seçmesini istiyorsanız 0.
nSocketType
SOCK_STREAM
veya SOCK_DGRAM
.
lpszSocketAddress
Bağlı yuvanın ağ adresini içeren bir dize işaretçisi, "128.56.22.8" gibi noktalı bir sayı. Bu parametre için NULL dizenin geçirilmesi, örneğin tüm ağ arabirimlerinde istemci etkinliğini dinlemesi gerektiğini gösterir CSocket
.
Dönüş Değeri
İşlev başarılı olursa sıfır olmayan; aksi takdirde 0 ve belirli bir hata kodu çağrılarak GetLastError
alınabilir.
Açıklamalar
Create
ardından yuvayı belirtilen adrese bağlamak için çağırır Bind
. Aşağıdaki yuva türleri desteklenir:
SOCK_STREAM
Sıralı, güvenilir, iki yönlü, bağlantı tabanlı bayt akışları sağlar. İnternet adresi ailesi için İletim Denetimi Protokolü(TCP) kullanır.SOCK_DGRAM
Sabit (genellikle küçük) maksimum uzunlukta bağlantısız, güvenilir olmayan arabellekler olan veri birimlerini destekler. İnternet adresi ailesi için Kullanıcı Veri Birimi Protokolü(UDP) kullanır. Bu seçeneği kullanmak için yuvayı birCArchive
nesneyle kullanmamalısınız.Not
Accept
Üye işlevi, parametresi olarak yeni, boşCSocket
bir nesneye başvuru alır. çağırmadanAccept
önce bu nesneyi oluşturmanız gerekir. Bu yuva nesnesi kapsam dışına çıkarsa bağlantının kapandığını unutmayın. Bu yeni yuva nesnesi için çağırmayınCreate
.
Akış ve veri birimi yuvaları hakkında daha fazla bilgi için Windows Yuvaları: Arka Plan, Windows Yuvaları: Bağlantı Noktaları ve Yuva Adresleri ve Windows Yuvaları: Yuvaları Arşivlerle Kullanma makalelerine bakın.
CSocket::CSocket
Bir CSocket
nesne oluşturur.
CSocket();
Açıklamalar
Oluşturmadan sonra üye işlevini çağırmanız Create
gerekir.
Daha fazla bilgi için bkz . Windows Yuvaları: Yuvaları Arşivlerle Kullanma.
CSocket::FromHandle
Bir nesnenin işaretçisini CSocket
döndürür.
static CSocket* PASCAL FromHandle(SOCKET hSocket);
Parametreler
hSocket
Bir yuvanın tutamacını içerir.
Dönüş Değeri
Bir CSocket
nesnenin işaretçisi veya NULL
öğesine eklenmiş hSocket
bir nesne yoksaCSocket
.
Açıklamalar
Tanıtıcı SOCKET
verildiğinde, bir CSocket
nesne tanıtıcıya bağlı değilse, üye işlevi döndürür NULL
ve geçici bir nesne oluşturmaz.
Daha fazla bilgi için bkz . Windows Yuvaları: Yuvaları Arşivlerle Kullanma.
CSocket::IsBlocking
Bir engelleme çağrısının devam ediyor olup olmadığını belirlemek için bu üye işlevini çağır.
BOOL IsBlocking();
Dönüş Değeri
Yuva engelleniyorsa sıfır olmayan; aksi takdirde 0.
Açıklamalar
Daha fazla bilgi için bkz . Windows Yuvaları: Yuvaları Arşivlerle Kullanma.
CSocket::OnMessagePending
Windows'tan belirli iletileri aramak ve yuvanızda yanıtlamak için bu üye işlevini geçersiz kılın.
virtual BOOL OnMessagePending();
Dönüş Değeri
İleti işlendiyse sıfır olmayan; aksi takdirde 0.
Açıklamalar
Bu, gelişmiş bir geçersiz kılınabilir.
Çerçeve, uygulamanıza yönelik ilgi çekici iletilerle ilgilenmeniz için size bir fırsat vermek için yuva Windows iletilerini çalıştırırken çağırır OnMessagePending
. uygulamasını nasıl kullanabileceğinize OnMessagePending
ilişkin örnekler için Windows Yuvaları: Yuva Sınıflarından Türetme makalesine bakın.
Daha fazla bilgi için bkz . Windows Yuvaları: Yuvaları Arşivlerle Kullanma.
Ayrıca bkz.
CAsyncSocket
Sınıf
Hiyerarşi Grafiği
CAsyncSocket
Sınıf
CSocketFile
Sınıf