Delen via


Windows Sockets: Sockets gebruiken met archieven

In dit artikel wordt het CSocket-programmeermodel beschreven. Klasse CSocket biedt socketondersteuning op een hoger abstractieniveau dan klasse CAsyncSocket. CSocket gebruikt een versie van het MFC-serialisatieprotocol om gegevens door te geven aan en van een socket-object via een MFC CArchive-object . CSocket zorgt voor blokkeren (en tegelijkertijd beheer van de achtergrondverwerking van Windows-berichten) en geeft u toegang tot CArchive, waarmee u veel aspecten van de communicatie beheert die u anders zelf zou moeten doen met behulp van de onbewerkte API of klasse CAsyncSocket.

Aanbeveling

U kunt klasse CSocket op zichzelf gebruiken, als een handigere versie van CAsyncSocket, maar het eenvoudigste programmeermodel is om te gebruiken CSocket met een CArchive object.

Zie Windows Sockets: How Sockets with Archives Work voor meer informatie over hoe de implementatie van sockets met archieven werkt. Zie bijvoorbeeld Windows Sockets: Reeks bewerkingen en Windows Sockets: Voorbeeld van sockets met behulp van archieven. Zie Windows Sockets: Afgeleid van socketklassen voor informatie over een aantal van de functionaliteit die u kunt verkrijgen door uw eigen klassen te afleiden uit de socketklassen.

Opmerking

Als u een MFC-clientprogramma schrijft om te communiceren met gevestigde (niet-MFC)-servers, verzendt u geen C++-objecten via het archief. Tenzij de server een MFC-toepassing is die inzicht heeft in het soort objecten dat u wilt verzenden, kan deze uw objecten niet ontvangen en deserialiseren. Zie het artikel Windows Sockets: Byte Ordering voor gerelateerd materiaal over het communiceren met niet-MFC-toepassingen.

Het CSocket-programmeermodel

Het gebruik van een CSocket object omvat het maken en koppelen van verschillende MFC-klasseobjecten. In de onderstaande algemene procedure wordt elke stap uitgevoerd door zowel de serversocket als de clientsocket, met uitzondering van stap 3, waarbij elk sockettype een andere actie vereist.

Aanbeveling

Tijdens runtime begint de servertoepassing meestal eerst klaar te zijn en 'luisteren' wanneer de clienttoepassing een verbinding zoekt. Als de server niet gereed is wanneer de client verbinding probeert te maken, moet u doorgaans de gebruikerstoepassing later opnieuw proberen verbinding te maken.

Communicatie tussen een serversocket en een clientsocket instellen

  1. Een CSocket-object maken.

  2. Gebruik het object om de onderliggende SOCKET handle te maken.

    Voor een CSocket clientobject moet u normaal gesproken de standaardparameters gebruiken om te maken, tenzij u een datagramsocket nodig hebt. Voor een CSocket serverobject moet u een poort in de Create aanroep opgeven.

    Opmerking

    CArchive werkt niet met datagram sockets. Als u CSocket wilt gebruiken voor een datagramsocket, moet u de klasse gebruiken zoals u CAsyncSocket zou gebruiken, namelijk zonder archief. Omdat datagrammen onbetrouwbaar zijn (niet gegarandeerd aankomen en mogelijk worden herhaald of niet op volgorde), zijn ze niet compatibel met serialisatie via een archief. U verwacht dat een serialisatiebewerking betrouwbaar en in volgorde wordt voltooid. Als u probeert te gebruiken CSocket met een CArchive object voor een datagram, mislukt een MFC-assertie.

  3. Als de socket een client is, roept u CAsyncSocket::Connect aan om het socketobject met een serversocket te verbinden.

    – of –

    Als de socket een server is, roept u CAsyncSocket aan::Luister om te luisteren naar verbindingspogingen van een client. Als u een verbindingsaanvraag ontvangt, accepteert u deze door CAsyncSocket::Accept aan te roepen.

    Opmerking

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

  4. Maak een CSocketFile-object en koppel het CSocket-object eraan.

  5. Maak een CArchive-object voor het laden (ontvangen) of opslaan (verzenden) van gegevens. Het archief is gekoppeld aan het CSocketFile object.

    Houd er rekening mee dat CArchive dit niet werkt met datagramsockets.

  6. Gebruik het CArchive object om gegevens door te geven tussen de client- en serversockets.

    Houd er rekening mee dat een bepaald CArchive object alleen gegevens in één richting verplaatst: voor het laden (ontvangen) of opslaan (verzenden). In sommige gevallen gebruikt u twee CArchive objecten: één voor het verzenden van gegevens, de andere voor het ontvangen van bevestigingen.

    Nadat u een verbinding hebt geaccepteerd en het archief hebt ingesteld, kunt u dergelijke taken uitvoeren, zoals het valideren van wachtwoorden.

  7. Vernietig het archief- en socketbestand en socketobjecten.

    Opmerking

    Klasse CArchive levert de IsBufferEmpty lidfunctie specifiek voor gebruik met klasse CSocket. Als de buffer bijvoorbeeld meerdere gegevensberichten bevat, moet u herhalen totdat ze allemaal worden gelezen en de buffer wordt gewist. Anders kan uw volgende melding dat er gegevens moeten worden ontvangen, voor onbepaalde tijd worden uitgesteld. Gebruik IsBufferEmpty dit om ervoor te zorgen dat u alle gegevens ophaalt.

Het artikel Windows Sockets: Reeks bewerkingen illustreert beide zijden van dit proces met voorbeeldcode.

Voor meer informatie, zie:

Zie ook

Windows Sockets in MFC
CSocket::Maken