Dela via


Windows Sockets: Använda socketar med arkiv

I den här artikeln beskrivs programmeringsmodellen CSocket. CSocket för klass tillhandahåller socketstöd på en högre abstraktionsnivå än klass CAsyncSocket. CSocket använder en version av MFC-serialiseringsprotokollet för att skicka data till och från ett socketobjekt via ett MFC CArchive-objekt . CSocket tillhandahåller blockering (vid hantering av bakgrundsbearbetning av Windows-meddelanden) och ger dig åtkomst till CArchive, som hanterar många aspekter av kommunikationen som du skulle behöva göra själv med antingen rå-API:et eller klassen CAsyncSocket.

Tips/Råd

Du kan använda klassen CSocket på egen hand som en mer praktisk version av CAsyncSocket, men den enklaste programmeringsmodellen är att använda CSocket med ett CArchive objekt.

Mer information om hur implementeringen av socketar med arkiv fungerar finns i Windows Sockets: How Sockets with Archives Work (Så fungerar socketar med arkiv). Exempelkod finns i Windows Sockets: Sequence of Operations och Windows Sockets: Example of Sockets Using Archives. Information om några av de funktioner som du kan få genom att härleda dina egna klasser från socketklasserna finns i Windows Sockets: Deriving from Socket Classes (Windows Sockets: Deriving from Socket Classes).

Anmärkning

Om du skriver ett MFC-klientprogram för att kommunicera med etablerade servrar (icke-MFC) ska du inte skicka C++-objekt via arkivet. Om inte servern är ett MFC-program som förstår vilka typer av objekt du vill skicka kan den inte ta emot och deserialisera dina objekt. Relaterat material om att kommunicera med icke-MFC-program finns också i artikeln Windows Sockets: Byte Ordering.

CSocket-programmeringsmodellen

Att använda ett CSocket objekt innebär att skapa och associera flera MFC-klassobjekt. I den allmänna proceduren nedan utförs varje steg av både server-socketen och klientsocket, förutom steg 3, där varje sockettyp kräver en annan åtgärd.

Tips/Råd

Vid körning startar serverprogrammet vanligtvis först för att vara redo och "lyssna" när klientprogrammet söker efter en anslutning. Om servern inte är redo när klienten försöker ansluta kräver du vanligtvis att användarprogrammet försöker ansluta igen senare.

Så här konfigurerar du kommunikation mellan en server-socket och en klientsocket

  1. Skapa ett CSocket-objekt .

  2. Använd -objektet för att skapa det underliggande SOCKET-handtaget .

    För ett CSocket klientobjekt bör du normalt använda standardparametrarna till Skapa, såvida du inte behöver ett datagramsocket. För ett CSocket serverobjekt måste du ange en port i anropet Create .

    Anmärkning

    CArchive fungerar inte med datagram sockets. Om du vill använda CSocket för en datagramsocket måste du använda klassen som du skulle använda CAsyncSocket, det vill sa utan arkiv. Eftersom datagram är otillförlitliga (det garanteras inte att de tas emot, kan upprepas eller tas emot i fel ordning) är de inte kompatibla med serialisering via ett arkiv. Du förväntar dig att en serialiseringsåtgärd slutförs på ett tillförlitligt sätt och i ordning. Om du försöker använda CSocket med ett CArchive objekt för ett datagram misslyckas en MFC-försäkran.

  3. Om socketen är en klient anropar du CAsyncSocket::Anslut för att ansluta socketobjektet till en server socket.

    -eller-

    Om socketen är en server anropar du CAsyncSocket::Lyssna för att börja lyssna efter anslutningsförsök från en klient. När du tar emot en anslutningsbegäran godkänner du den genom att anropa CAsyncSocket::Accept.

    Anmärkning

    Medlemsfunktionen Accept använder en referens till ett nytt, tomt CSocket objekt som parameter. Du måste skapa det här objektet innan du anropar Accept. Om det här socketobjektet hamnar utanför omfånget stängs anslutningen. Anropa Create inte för det nya socketobjektet.

  4. Skapa ett CSocketFile-objekt som associerar CSocket objektet med det.

  5. Skapa ett CArchive-objekt för att antingen läsa in (ta emot) eller lagra (skicka) data. Arkivet är associerat med objektet CSocketFile .

    Tänk på att CArchive det inte fungerar med datagram-socketar.

  6. Använd - CArchive objektet för att skicka data mellan klient- och server-socketarna.

    Tänk på att ett visst CArchive objekt endast flyttar data i en riktning: antingen för inläsning (mottagning) eller lagring (sändning). I vissa fall använder du två CArchive objekt: ett för att skicka data, det andra för att ta emot bekräftelser.

    När du har accepterat en anslutning och konfigurerat arkivet kan du utföra sådana uppgifter som att verifiera lösenord.

  7. Förstör arkivet, socket-filen och socket-objekten.

    Anmärkning

    Klassen CArchive tillhandahåller IsBufferEmpty medlemsfunktionen specifikt för användning med klassen CSocket. Om bufferten innehåller flera datameddelanden måste du till exempel loopa tills alla har lästs och bufferten har rensats. I annat fall kan nästa meddelande om att det finns data som ska tas emot fördröjas på obestämd tid. Använd IsBufferEmpty för att säkerställa att du hämtar alla data.

Artikeln Windows Sockets: Sequence of Operations illustrerar båda sidor av den här processen med exempelkod.

Mer information finns i:

Se även

Windows Sockets i MFC
CSocket::Skapa