Megosztás a következőn keresztül:


CSocket osztály

Megjegyzés:

A Microsoft Foundation Classes (MFC) könyvtár továbbra is támogatott. A továbbiakban azonban nem adunk hozzá funkciókat, és nem frissítjük a dokumentációt.

A Windows Sockets API-ból származik CAsyncSocket, örökli annak beágyazását, és magasabb absztrakciós szintet képvisel, mint egy CAsyncSocket objektum.

Szemantika

class CSocket : public CAsyncSocket

Tagok

Nyilvános konstruktorok

Név Description
CSocket::CSocket Egy CSocket objektumot hoz létre.

Nyilvános metódusok

Név Description
CSocket::Attach SOCKET Fogópontot csatol egy CSocket objektumhoz.
CSocket::CancelBlockingCall Megszakítja a jelenleg folyamatban lévő blokkoló hívást.
CSocket::Create Létrehoz egy szoftvercsatornát.
CSocket::FromHandle Egy mutatót ad vissza egy CSocket objektumhoz, egy fogópontot SOCKET ad vissza.
CSocket::IsBlocking Meghatározza, hogy egy blokkoló hívás folyamatban van-e.

Védett metódusok

Név Description
CSocket::OnMessagePending A hívás a függőben lévő üzenetek feldolgozására szólított fel, miközben egy blokkoló hívás befejezésére vár.

Megjegyzések

CSocket az osztályokkal CSocketFileCArchive együttműködve kezeli az adatok küldését és fogadását.

Az CSocket objektumok blokkolást is biztosítanak, ami elengedhetetlen a szinkron művelethez CArchive. A blokkoló függvények, például Receivea , Send, SendToReceiveFrom, és Accept (az összes öröklöttCAsyncSocket) nem ad vissza WSAEWOULDBLOCK hibát a következőbenCSocket: . Ehelyett ezek a függvények megvárják, amíg a művelet befejeződik. Emellett az eredeti hívás WSAEINTR hibával fog leállni, ha CancelBlockingCall a rendszer meghívja őket, miközben az egyik függvény blokkolva van.

Objektum használatához CSocket hívja meg a konstruktort, majd hívja Create meg a mögöttes SOCKET leírót (írja be SOCKET). A streamcsatornák Create létrehozásának alapértelmezett paraméterei, de ha nem objektummal CArchive használja a szoftvercsatornát, megadhat egy paramétert a datagram-szoftvercsatornák létrehozásához, vagy egy adott porthoz kötéssel egy kiszolgálócsatornát hozhat létre. Csatlakozzon egy ügyfélcsatornához Connect az ügyféloldalon és Accept a kiszolgálóoldalon. Ezután hozzon létre egy CSocketFile objektumot, és társítsa az CSocket objektumhoz a CSocketFile konstruktorban. Ezután hozzon létre egy CArchive objektumot a küldéshez, egyet pedig az adatok fogadásához (szükség szerint), majd társítsa őket a CSocketFileCArchive konstruktor objektumához. Ha a kommunikáció befejeződött, pusztítsa el a CArchive, CSocketFileés CSocket objektumokat. Az SOCKET adattípust a Windows Szoftvercsatornák: Háttér című cikkben ismertetjük.

A használat CArchiveCSocketFileCSocketsorán előfordulhat, hogy CSocket::Receive egy ciklust (by PumpMessages(FD_READ)) ad meg, amely a kért bájtmennyiségre vár. Ennek az az oka, hogy a Windows-szoftvercsatornák értesítésenként FD_READ csak egy recv hívást engedélyeznek, de CSocketFileCSocket több recv-hívást is engedélyeznek.FD_READ Ha olyan adatot kap FD_READ , amely nem olvasható, az alkalmazás lefagy. Ha soha nem kap másikat FD_READ, az alkalmazás nem kommunikál a szoftvercsatornán keresztül.

Ezt a problémát az alábbiak szerint oldhatja meg. OnReceive A szoftvercsatornaosztály metódusában hívja meg CAsyncSocket::IOCtl(FIONREAD, ...) az Serialize üzenetosztály metódusát, ha a szoftvercsatornából beolvasandó várt adatok mérete meghaladja az egy TCP-csomag méretét (a hálózati adathordozó maximális átviteli egysége, általában legalább 1096 bájt). Ha a rendelkezésre álló adatok mérete kisebb a szükségesnél, várja meg az összes adat fogadását, és csak ezután indítsa el az olvasási műveletet.

Az alábbi példában m_dwExpected a felhasználó által várt bájtok hozzávetőleges száma látható. Feltételezzük, hogy a kódot máshol deklarálja.

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
   }
}

Megjegyzés:

Ha MFC-szoftvercsatornákat használ másodlagos szálakban egy statikusan csatolt MFC-alkalmazásban, minden olyan szálban meg kell hívnia AfxSocketInit , amely szoftvercsatornákat használ a szoftvercsatorna-kódtárak inicializálásához. Alapértelmezés szerint AfxSocketInit csak az elsődleges szálban van meghívva.

További információ: Windows Sockets in MFC, Windows Sockets: Using Sockets with Archives, Windows Sockets: How Sockets with Archives Work, Windows Sockets: Sequence of Operations, Windows Sockets: Example of Sockets Using Archives.

Öröklési hierarchia

CObject

CAsyncSocket

CSocket

Requirements

Fejléc:afxsock.h

CSocket::Attach

A tagfüggvény meghívásával csatolja a hSocket leírót egy CSocket objektumhoz.

BOOL Attach(SOCKET hSocket);

Paraméterek

hSocket
Egy szoftvercsatorna fogópontját tartalmazza.

Visszaadott érték

Nonzero, ha a függvény sikeres.

Megjegyzések

A SOCKET leírót az objektum adattagja m_hSocket tárolja.

További információ : Windows-szoftvercsatornák: Szoftvercsatornák használata archívumokkal.

Example

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

Hívja meg ezt a tagfüggvényt a jelenleg folyamatban lévő blokkoló hívás megszakításához.

void CancelBlockingCall();

Megjegyzések

Ez a függvény megszakítja a szoftvercsatornához tartozó összes lezáratlan blokkolási műveletet. Az eredeti blokkoló hívás a lehető leghamarabb leáll a hibával WSAEINTR.

Blokkolási Connect művelet esetén a Windows Sockets implementációja a lehető leghamarabb leállítja a blokkoló hívást, de előfordulhat, hogy a szoftvercsatornák erőforrásai csak a kapcsolat befejezéséig (majd alaphelyzetbe állításáig) vagy időtúllépéséig lesznek felszabadítva. Ez valószínűleg csak akkor lesz észrevehető, ha az alkalmazás azonnal megpróbál megnyitni egy új szoftvercsatornát (ha nincs elérhető szoftvercsatorna), vagy ugyanahhoz a társhoz csatlakozik.

Ha nem törli a műveletet Accept , az meghatározatlan állapotban hagyhatja el a szoftvercsatornát. Ha egy alkalmazás megszakít egy blokkoló műveletet egy szoftvercsatornán, az egyetlen művelet, amelytől az alkalmazás függhet, hogy képes-e végrehajtani a szoftvercsatornát, az a hívás Close, bár más műveletek is működhetnek bizonyos Windows Sockets-implementációkon. Ha maximális hordozhatóságot szeretne az alkalmazás számára, ügyeljen arra, hogy ne függjön a megszakítás utáni műveletek végrehajtásától.

További információ : Windows-szoftvercsatornák: Szoftvercsatornák használata archívumokkal.

CSocket::Create

Hívja meg a Create tagfüggvényt egy szoftvercsatorna-objektum létrehozása után a Windows-szoftvercsatorna létrehozásához és csatolásához.

BOOL Create(
    UINT nSocketPort = 0,
    int nSocketType = SOCK_STREAM,
    LPCTSTR lpszSocketAddress = NULL);

Paraméterek

nSocketPort
Egy adott port, amelyet a szoftvercsatornával kell használni, vagy 0, ha azt szeretné, hogy az MFC válasszon ki egy portot.

nSocketType
SOCK_STREAM vagy SOCK_DGRAM.

lpszSocketAddress
Mutató a csatlakoztatott szoftvercsatorna hálózati címét tartalmazó sztringre, egy pontozott számra, például "128.56.22.8". A paraméter NULL sztringjének átadása azt jelzi, hogy a példánynak figyelnie kell az CSocket ügyféltevékenységet az összes hálózati adapteren.

Visszaadott érték

Nonzero, ha a függvény sikeres; ellenkező esetben 0, és egy adott hibakód lekérhető a hívással GetLastError.

Megjegyzések

Create ezután meghívja Bind a szoftvercsatornát a megadott címhez kötésre. A következő szoftvercsatorna-típusok támogatottak:

  • SOCK_STREAM Szekvenciált, megbízható, kétirányú, kapcsolatalapú bájtstreameket biztosít. A Transmission Control Protocol (TCP) protokollt használja az internetcímcsaládhoz.

  • SOCK_DGRAM Támogatja a rögzített (általában kis) maximális hosszúságú, kapcsolat nélküli, megbízhatatlan puffereket. A User Datagram Protocol (UDP) protokollt használja az internetcímcsaládhoz. A beállítás használatához nem használhatja a szoftvercsatornát objektummal CArchive .

    Megjegyzés:

    A Accept tagfüggvény paraméterként egy új, üres CSocket objektumra mutató hivatkozást vesz fel. Önnek létre kell hoznia ezt az objektumot, mielőtt hívja a Accept-t. Ne feledje, hogy ha ez a szoftvercsatorna-objektum kiesik a hatókörből, a kapcsolat bezárul. Ne hívja meg Create ezt az új szoftvercsatorna-objektumot.

A stream- és datagram-szoftvercsatornákról további információt a Windows Sockets: Background, a Windows Sockets: Ports and Socket Addresses, valamint a Windows Sockets: Using Sockets with Archives című cikkben talál.

CSocket::CSocket

Egy CSocket objektumot hoz létre.

CSocket();

Megjegyzések

Az építés után meg kell hívnia a tagfüggvényt Create .

További információ : Windows-szoftvercsatornák: Szoftvercsatornák használata archívumokkal.

CSocket::FromHandle

Egy objektumra mutató mutatót CSocket ad vissza.

static CSocket* PASCAL FromHandle(SOCKET hSocket);

Paraméterek

hSocket
Egy szoftvercsatorna fogópontját tartalmazza.

Visszaadott érték

Egy objektumra mutató CSocket mutató, vagy NULL ha nincs CSocket objektum csatolva.hSocket

Megjegyzések

Ha egy fogópontot SOCKET ad meg, ha egy CSocket objektum nincs csatolva a fogóponthoz, a tagfüggvény visszatér NULL , és nem hoz létre ideiglenes objektumot.

További információ : Windows-szoftvercsatornák: Szoftvercsatornák használata archívumokkal.

CSocket::IsBlocking

Hívja meg ezt a tagfüggvényt annak megállapításához, hogy van-e folyamatban blokkoló hívás.

BOOL IsBlocking();

Visszaadott érték

Nonzero, ha a foglalat blokkolva van; egyéb esetben 0.

Megjegyzések

További információ : Windows-szoftvercsatornák: Szoftvercsatornák használata archívumokkal.

CSocket::OnMessagePending

Bírálja felül ezt a tagfüggvényt, hogy megkeresse a Windows adott üzeneteit, és válaszoljon rájuk a szoftvercsatornában.

virtual BOOL OnMessagePending();

Visszaadott érték

Nemzero, ha az üzenetet kezelték; egyéb esetben 0.

Megjegyzések

Ez egy speciális felülírható.

A keretrendszer meghívja OnMessagePending , miközben a szoftvercsatorna Windows-üzeneteket pumpál, hogy lehetőséget biztosítson az alkalmazás számára érdekes üzenetek kezelésére. A használat OnMessagePendingmódjára példaként tekintse meg a Windows Sockets: Származtatás a szoftvercsatornák osztályaiból című cikket.

További információ : Windows-szoftvercsatornák: Szoftvercsatornák használata archívumokkal.

Lásd még

CAsyncSocket osztály
hierarchiadiagram
CAsyncSocket osztály
CSocketFile osztály