Share via


CSocket-klasse

Opmerking

De Microsoft Foundation Classes-bibliotheek (MFC) wordt nog steeds ondersteund. We voegen echter geen functies meer toe of werken de documentatie bij.

Afgeleid van CAsyncSocket, neemt de inkapseling van de Windows Sockets-API over en vertegenwoordigt een hoger abstractieniveau dan dat van een CAsyncSocket object.

Syntaxis

class CSocket : public CAsyncSocket

Leden

Openbare constructors

Naam Description
CSocket::CSocket Maakt een CSocket object.

Openbare methoden

Naam Description
CSocket::Attach Hiermee wordt een SOCKET ingang aan een CSocket object gekoppeld.
CSocket::CancelBlockingCall Hiermee wordt een blokkeringsoproep geannuleerd die momenteel wordt uitgevoerd.
CSocket::Create Hiermee maakt u een socket.
CSocket::FromHandle Retourneert een aanwijzer naar een CSocket object, op basis van een SOCKET ingang.
CSocket::IsBlocking Bepaalt of een blokkeringsoproep wordt uitgevoerd.

Beveiligde methoden

Naam Description
CSocket::OnMessagePending Aangeroepen om berichten in behandeling te verwerken terwijl wordt gewacht tot een blokkeringsoproep is voltooid.

Opmerkingen

CSocket werkt met klassen CSocketFile en CArchive om het verzenden en ontvangen van gegevens te beheren.

Een CSocket object biedt ook blokkeren, wat essentieel is voor de synchrone werking van CArchive. Blokkerende functies, zoals Receive, Send, ReceiveFrom, , SendToen Accept (alle overgenomen van CAsyncSocket), retourneren WSAEWOULDBLOCK geen fout in CSocket. In plaats daarvan wachten deze functies totdat de bewerking is voltooid. Bovendien wordt de oorspronkelijke aanroep beëindigd met de fout WSAEINTR als deze wordt aangeroepen terwijl CancelBlockingCall een van deze functies wordt geblokkeerd.

Als u een CSocket object wilt gebruiken, roept u de constructor aan en roept Create u vervolgens aan om de onderliggende SOCKET ingang (type SOCKET) te maken. De standaardparameters voor het maken van Create een stroomsocket, maar als u de socket niet met een CArchive object gebruikt, kunt u in plaats daarvan een parameter opgeven om een datagramsocket te maken of een specifieke poort verbinden om een serversocket te maken. Maak verbinding met een clientsocket aan Connect de clientzijde en Accept aan de serverzijde. Maak vervolgens een CSocketFile object en koppel het aan het CSocket object in de CSocketFile constructor. Maak vervolgens een CArchive object voor verzenden en één voor het ontvangen van gegevens (indien nodig) en koppel deze vervolgens aan het CSocketFile object in de CArchive constructor. Wanneer de communicatie is voltooid, vernietigt u de CArchive, CSocketFileen CSocket objecten. Het SOCKET gegevenstype wordt beschreven in het artikel Windows Sockets: Background.

Wanneer u CArchive met CSocketFile en CSocket, kunt u een situatie tegenkomen waarbij CSocket::Receive een lus (per PumpMessages(FD_READ)) wordt ingevoerd die wacht op de aangevraagde hoeveelheid bytes. Dit komt doordat Windows-sockets slechts één recv-aanroep per FD_READ melding toestaan, maar CSocketFile meerdere CSocket recv-aanroepen per FD_READtoestaan. Als er geen FD_READ gegevens worden gelezen, loopt de toepassing vast. Als u nooit een andere FD_READkrijgt, stopt de toepassing met communiceren via de socket.

U kunt dit probleem als volgt oplossen. Roep in de OnReceive methode van uw socketklasse CAsyncSocket::IOCtl(FIONREAD, ...) aan voordat u de Serialize methode van uw berichtklasse aanroept wanneer de verwachte gegevens uit de socket de grootte van één TCP-pakket overschrijden (maximale transmissie-eenheid van het netwerkmedium, meestal ten minste 1096 bytes). Als de grootte van de beschikbare gegevens kleiner is dan nodig is, wacht u tot alle gegevens zijn ontvangen en start u de leesbewerking alleen.

In het volgende voorbeeld m_dwExpected is het geschatte aantal bytes dat de gebruiker verwacht te ontvangen. Er wordt van uitgegaan dat u deze ergens anders in uw code declareert.

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

Opmerking

Wanneer u MFC-sockets gebruikt in secundaire threads in een statisch gekoppelde MFC-toepassing, moet u elke thread aanroepen AfxSocketInit die sockets gebruikt om de socketbibliotheken te initialiseren. AfxSocketInit Standaard wordt alleen aangeroepen in de primaire thread.

Zie 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.

Overnamehiërarchie

CObject

CAsyncSocket

CSocket

Requirements

Rubriek:afxsock.h

CSocket::Attach

Roep deze lidfunctie aan om de hSocket ingang aan een CSocket object te koppelen.

BOOL Attach(SOCKET hSocket);

Parameterwaarden

hSocket
Bevat een greep naar een socket.

Retourwaarde

Niet-nul als de functie is geslaagd.

Opmerkingen

De SOCKET ingang wordt opgeslagen in het gegevenslid van m_hSocket het object.

Zie Windows Sockets: Sockets gebruiken met archieven voor meer informatie.

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

Roep deze lidfunctie aan om een blokkerende aanroep te annuleren die momenteel wordt uitgevoerd.

void CancelBlockingCall();

Opmerkingen

Deze functie annuleert eventuele openstaande blokkeringsbewerkingen voor deze socket. De oorspronkelijke blokkeringsoproep wordt zo snel mogelijk beëindigd met de fout WSAEINTR.

In het geval van een blokkeringsbewerking Connect beëindigt de Implementatie van Windows Sockets de blokkeringsaanroep zo snel mogelijk, maar het is mogelijk niet mogelijk dat de socketresources worden vrijgegeven totdat de verbinding is voltooid (en vervolgens opnieuw is ingesteld) of een time-out optreedt. Dit is waarschijnlijk alleen merkbaar als de toepassing onmiddellijk probeert een nieuwe socket te openen (als er geen sockets beschikbaar zijn) of om verbinding te maken met dezelfde peer.

Annuleren van een andere bewerking dan Accept kan de socket een onbepaalde status hebben. Als een toepassing een blokkeringsbewerking op een socket annuleert, is de enige bewerking die de toepassing kan uitvoeren afhankelijk van het feit dat de socket kan worden uitgevoerd, een aanroep naar Close, hoewel andere bewerkingen kunnen werken voor sommige Implementaties van Windows Sockets. Als u maximale draagbaarheid voor uw toepassing wenst, moet u er voorzichtig mee zijn dat u niet afhankelijk bent van het uitvoeren van bewerkingen na een annulering.

Zie Windows Sockets: Sockets gebruiken met archieven voor meer informatie.

CSocket::Create

Roep de Create lidfunctie aan nadat u een socketobject hebt gemaakt om de Windows-socket te maken en deze te koppelen.

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

Parameterwaarden

nSocketPort
Een bepaalde poort die moet worden gebruikt met de socket of 0 als u wilt dat MFC een poort selecteert.

nSocketType
SOCK_STREAM of SOCK_DGRAM.

lpszSocketAddress
Een aanwijzer naar een tekenreeks met het netwerkadres van de verbonden socket, een gestippeld getal, zoals '128.56.22.8'. Het doorgeven van de NULL-tekenreeks voor deze parameter geeft aan dat het CSocket exemplaar moet luisteren naar clientactiviteit op alle netwerkinterfaces.

Retourwaarde

Niet-nul als de functie is geslaagd; anders 0 en een specifieke foutcode kan worden opgehaald door aan te roepen GetLastError.

Opmerkingen

Create Bind roept vervolgens aan om de socket te binden aan het opgegeven adres. De volgende sockettypen worden ondersteund:

  • SOCK_STREAM Biedt gesequentieerde, betrouwbare, tweerichtings-bytestreams op basis van verbindingen. Maakt gebruik van Transmission Control Protocol (TCP) voor de internetadresfamilie.

  • SOCK_DGRAM Ondersteunt datagrammen, die verbindingsloze, onbetrouwbare buffers van een vaste (meestal kleine) maximale lengte zijn. Gebruikt UDP (User Datagram Protocol) voor de internetadresfamilie. Als u deze optie wilt gebruiken, moet u de socket niet gebruiken met een CArchive object.

    Opmerking

    De Accept lidfunctie verwijst naar een nieuw, leeg CSocket object als parameter. U moet dit object maken voordat u aanroept Accept. Houd er rekening mee dat als dit socketobject buiten het bereik valt, de verbinding wordt gesloten. Roep dit nieuwe socketobject niet aan Create .

Zie de artikelen Windows Sockets: Background, Windows Sockets: Ports and Sockets, and Windows Sockets, and Windows Sockets: Using Sockets with Archives voor meer informatie over stromen en datagram sockets.

CSocket::CSocket

Maakt een CSocket object.

CSocket();

Opmerkingen

Na de constructie moet u de Create lidfunctie aanroepen.

Zie Windows Sockets: Sockets gebruiken met archieven voor meer informatie.

CSocket::FromHandle

Retourneert een aanwijzer naar een CSocket object.

static CSocket* PASCAL FromHandle(SOCKET hSocket);

Parameterwaarden

hSocket
Bevat een greep naar een socket.

Retourwaarde

Een aanwijzer naar een CSocket object of NULL als er geen CSocket object aan is gekoppeld hSocket.

Opmerkingen

Wanneer een SOCKET ingang wordt gegeven en een CSocket object niet aan de ingang is gekoppeld, retourneert NULL de lidfunctie en wordt er geen tijdelijk object gemaakt.

Zie Windows Sockets: Sockets gebruiken met archieven voor meer informatie.

CSocket::IsBlocking

Roep deze lidfunctie aan om te bepalen of er een blokkerende aanroep wordt uitgevoerd.

BOOL IsBlocking();

Retourwaarde

Niet-nul als de socket wordt geblokkeerd; anders 0.

Opmerkingen

Zie Windows Sockets: Sockets gebruiken met archieven voor meer informatie.

CSocket::OnMessagePending

Overschrijf deze lidfunctie om te zoeken naar bepaalde berichten van Windows en erop te reageren in uw socket.

virtual BOOL OnMessagePending();

Retourwaarde

Niet-nul als het bericht is verwerkt; anders 0.

Opmerkingen

Dit is een geavanceerd overschrijfbaar.

Het framework roept aan OnMessagePending terwijl de socket Windows-berichten pompt, zodat u kunt omgaan met berichten die van belang zijn voor uw toepassing. Zie het artikel Windows Sockets: Afgeleid van Socket-klassen voor voorbeelden van hoe u deze kunt gebruikenOnMessagePending.

Zie Windows Sockets: Sockets gebruiken met archieven voor meer informatie.

Zie ook

CAsyncSocket klasse
Hiërarchiegrafiek
CAsyncSocket klasse
CSocketFile klasse