Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
öğesinden CAsyncSockettü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 CArchiveiçin gerekli olan engellemeyi de sağlar. , ReceiveFromSendToSend, , ve Accept (tümü öğesinden devralınanCAsyncSocket) gibi Receiveengelleyici işlevler içinde CSockethata 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 , CSocketFileve CSocket nesnelerini yok edinCArchive. SOCKET Veri türü Windows Yuvaları: Arka Plan makalesinde açıklanmıştır.
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 bildirim başına FD_READ yalnızca bir geri kazanma çağrısına izin vermeleri, ancak CSocketFile CSocket her biri için FD_READbirden ç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_READuygulama 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 WSAEINTRen 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 GetLastErroralı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_STREAMSı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_DGRAMSabit (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ı birCArchivenesneyle kullanmamalısınız.Not
AcceptÜye işlevi, parametresi olarak yeni, boşCSocketbir 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ş hSocketbir 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 OnMessagePendingiliş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