Aracılığıyla paylaş


CSocket Sınıf

öğ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

CObject

CAsyncSocket

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_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ı bir CArchive nesneyle kullanmamalısınız.

    Not

    Accept Üye işlevi, parametresi olarak yeni, boş CSocket bir nesneye başvuru alır. çağırmadan Acceptö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ın Create .

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