Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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
Een CSocket-object maken.
Gebruik het object om de onderliggende SOCKET handle te maken.
Voor een
CSocketclientobject moet u normaal gesproken de standaardparameters gebruiken om te maken, tenzij u een datagramsocket nodig hebt. Voor eenCSocketserverobject moet u een poort in deCreateaanroep opgeven.Opmerking
CArchivewerkt niet met datagram sockets. Als uCSocketwilt gebruiken voor een datagramsocket, moet u de klasse gebruiken zoals uCAsyncSocketzou 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 gebruikenCSocketmet eenCArchiveobject voor een datagram, mislukt een MFC-assertie.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
Acceptlidfunctie verwijst naar een nieuw, leegCSocketobject als parameter. U moet dit object maken voordat u aanroeptAccept. Als dit socketobject buiten het bereik valt, wordt de verbinding gesloten. Roep dit nieuwe socketobject niet aanCreate.Maak een CSocketFile-object en koppel het
CSocket-object eraan.Maak een CArchive-object voor het laden (ontvangen) of opslaan (verzenden) van gegevens. Het archief is gekoppeld aan het
CSocketFileobject.Houd er rekening mee dat
CArchivedit niet werkt met datagramsockets.Gebruik het
CArchiveobject om gegevens door te geven tussen de client- en serversockets.Houd er rekening mee dat een bepaald
CArchiveobject alleen gegevens in één richting verplaatst: voor het laden (ontvangen) of opslaan (verzenden). In sommige gevallen gebruikt u tweeCArchiveobjecten: éé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.
Vernietig het archief- en socketbestand en socketobjecten.
Opmerking
Klasse
CArchivelevert deIsBufferEmptylidfunctie specifiek voor gebruik met klasseCSocket. 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. GebruikIsBufferEmptydit 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: