Windows Sockets: używanie gniazd z archiwamiWindows Sockets: Using Sockets with Archives

W tym artykule opisano model programowania CSocket.This article describes the CSocket programming model. Klasy CSocket udostępniają wsparcie dla gniazda na wyższym poziomie abstrakcji niż w klasie CAsyncSocket.Class CSocket supplies socket support at a higher level of abstraction than does class CAsyncSocket. CSocket używa wersji protokołu serializacji MFC do przekazywania danych do i z obiektu gniazda za pośrednictwem obiektu MFC CArchive .CSocket uses a version of the MFC serialization protocol to pass data to and from a socket object through an MFC CArchive object. CSocket zapewnia blokowanie (podczas zarządzania przetwarzaniem komunikatów systemu Windows w tle) i zapewnia dostęp do programu CArchive , który zarządza wieloma aspektami komunikacji, które trzeba wykonać samodzielnie przy użyciu raw API lub klasy CAsyncSocket .CSocket provides blocking (while managing background processing of Windows messages) and gives you access to CArchive, which manages many aspects of the communication that you would have to do yourself using either the raw API or class CAsyncSocket.

Porada

Możesz użyć samej klasy CSocket , jako bardziej wygodnej wersji CAsyncSocket , ale najprostszy model programowania jest używany CSocket z CArchive obiektem.You can use class CSocket by itself, as a more convenient version of CAsyncSocket, but the simplest programming model is to use CSocket with a CArchive object.

Aby uzyskać więcej informacji na temat sposobu działania implementacji gniazd z archiwami, zobacz Windows Sockets: jak działają gniazda z archiwami.For more information about how the implementation of sockets with archives works, see Windows Sockets: How Sockets with Archives Work. Na przykład kod można znaleźć w temacie Windows Sockets: Sekwencja operacji i Windows Sockets: przykład gniazd korzystających z archiwów.For example code, see Windows Sockets: Sequence of Operations and Windows Sockets: Example of Sockets Using Archives. Aby uzyskać informacje o niektórych funkcjach, które można uzyskać przez wyjęcie własnych klas z klas Sockets, zobacz Windows Sockets: pochodne z klas gniazd.For information about some of the functionality you can gain by deriving your own classes from the sockets classes, see Windows Sockets: Deriving from Socket Classes.

Uwaga

W przypadku pisania programu klienckiego MFC w celu komunikowania się z ustalonymi serwerami (bez MFC) nie należy wysyłać obiektów C++ za pomocą archiwum.If you are writing an MFC client program to communicate with established (non-MFC) servers, do not send C++ objects through the archive. Chyba że serwer jest aplikacją MFC, która zrozumie rodzaje obiektów, które chcesz wysłać, nie będzie można odbierać i deserializować obiektów.Unless the server is an MFC application that understands the kinds of objects you want to send, it will not be able to receive and deserialize your objects. W przypadku pokrewnego materiału z tematu komunikowania się z aplikacjami nienależącymi do MFC Zobacz również artykuł Windows Sockets: porządkowanie bajtów.For related material on the subject of communicating with non-MFC applications, also see the article Windows Sockets: Byte Ordering.

Model programowania CSocketThe CSocket Programming Model

Użycie CSocket obiektu obejmuje tworzenie i kojarzenie razem kilku obiektów klas MFC.Using a CSocket object involves creating and associating together several MFC class objects. W ogólnej procedurze poniżej każdy krok jest podejmowany zarówno przez gniazdo serwera, jak i gniazdo klienta, z wyjątkiem kroku 3, w którym każdy typ gniazda wymaga innej akcji.In the general procedure below, each step is taken by both the server socket and the client socket, except for step 3, in which each socket type requires a different action.

Porada

W czasie wykonywania aplikacja serwera zwykle zaczyna być gotowa i "nasłuchuje", gdy aplikacja kliencka wyszukuje połączenie.At run time, the server application usually starts first to be ready and "listening" when the client application seeks a connection. Jeśli serwer nie jest gotowy, gdy klient próbuje nawiązać połączenie, zazwyczaj aplikacja użytkownika wymaga ponownego nawiązania połączenia później.If the server is not ready when the client tries to connect, you typically require the user application to try connecting again later.

Aby skonfigurować komunikację między gniazdem serwera i gniazdem klientaTo set up communication between a server socket and a client socket

  1. Utwórz obiekt CSocket .Construct a CSocket object.

  2. Użyj obiektu, aby utworzyć podstawowy uchwyt gniazda .Use the object to create the underlying SOCKET handle.

    W przypadku CSocket obiektu klienta zazwyczaj należy używać domyślnych parametrów do utworzenia, chyba że potrzebujesz gniazda datagramu.For a CSocket client object, you should normally use the default parameters to Create, unless you need a datagram socket. Dla CSocket obiektu serwera należy określić port w Create wywołaniu.For a CSocket server object, you must specify a port in the Create call.

    Uwaga

    CArchive Program nie współpracuje z gniazdami datagramów.CArchive does not work with datagram sockets. Jeśli chcesz użyć CSocket dla gniazda datagramu, musisz użyć klasy, CAsyncSocket która ma być używana, czyli bez archiwum.If you want to use CSocket for a datagram socket, you must use the class as you would use CAsyncSocket, that is, without an archive. Ze względu na to, że datagramy są niezawodne (niegwarantowane i mogą być powtórzone lub z sekwencji), nie są zgodne z serializacji za pomocą archiwum.Because datagrams are unreliable (not guaranteed to arrive and may be repeated or out of sequence), they are not compatible with serialization through an archive. Oczekuje się, że operacja serializacji zostanie wykonana niezawodnie i w kolejności.You expect a serialization operation to complete reliably and in sequence. Jeśli spróbujesz użyć CSocket z CArchive obiektem dla datagramu, potwierdzenie MFC zakończy się niepowodzeniem.If you try to use CSocket with a CArchive object for a datagram, an MFC assertion fails.

  3. Jeśli gniazdo jest klientem, wywołaj CAsyncSocket:: Connect , aby połączyć obiekt Socket z gniazdem serwera.If the socket is a client, call CAsyncSocket::Connect to connect the socket object to a server socket.

    -lub--or-

    Jeśli gniazdo jest serwerem, wywołaj CAsyncSocket:: Listen , aby rozpocząć nasłuchiwanie prób połączenia od klienta.If the socket is a server, call CAsyncSocket::Listen to begin listening for connect attempts from a client. Po odebraniu żądania połączenia zaakceptuj je przez wywołanie CAsyncSocket:: Accept.Upon receiving a connection request, accept it by calling CAsyncSocket::Accept.

    Uwaga

    AcceptFunkcja członkowska przyjmuje odwołanie do nowego, pustego CSocket obiektu jako jego parametru.The Accept member function takes a reference to a new, empty CSocket object as its parameter. Należy skonstruować ten obiekt przed wywołaniem Accept .You must construct this object before you call Accept. Jeśli ten obiekt gniazda wykracza poza zakres, połączenie zostanie zamknięte.If this socket object goes out of scope, the connection closes. Nie wywołuj Create dla tego nowego obiektu gniazda.Do not call Create for this new socket object.

  4. Utwórz obiekt CSocketFile , kojarząc CSocket z nim obiekt.Create a CSocketFile object, associating the CSocket object with it.

  5. Utwórz obiekt CArchive do ładowania (otrzymywania) lub zapisywania (wysyłania) danych.Create a CArchive object for either loading (receiving) or storing (sending) data. Archiwum jest skojarzone z CSocketFile obiektem.The archive is associated with the CSocketFile object.

    Należy pamiętać, że program nie CArchive współpracuje z gniazdami datagramów.Keep in mind that CArchive does not work with datagram sockets.

  6. Użyj CArchive obiektu, aby przekazać dane między gniazdem klienta i serwera.Use the CArchive object to pass data between the client and server sockets.

    Należy pamiętać, że dany CArchive obiekt przenosi dane tylko w jednym kierunku: w przypadku ładowania (otrzymywania) lub przechowywania (wysyłania).Keep in mind that a given CArchive object moves data in one direction only: either for loading (receiving) or storing (sending). W niektórych przypadkach zostaną użyte dwa CArchive obiekty: jeden do wysyłania danych, drugi do otrzymywania potwierdzeń.In some cases, you will use two CArchive objects: one for sending data, the other for receiving acknowledgments.

    Po zaakceptowaniu połączenia i skonfigurowaniu archiwum można wykonać takie zadania jak Walidacja haseł.After accepting a connection and setting up the archive, you can perform such tasks as validating passwords.

  7. Zniszcz obiekty archiwalne, Socket i Sockets.Destroy the archive, socket file, and socket objects.

    Uwaga

    Klasa CArchive dostarcza IsBufferEmpty funkcję elementu członkowskiego, która jest przeznaczona do użycia z klasą CSocket .Class CArchive supplies the IsBufferEmpty member function specifically for use with class CSocket. Jeśli bufor zawiera wiele komunikatów danych, na przykład należy wykonać pętlę do momentu, aż wszystkie z nich zostaną odczytane i bufor zostanie wyczyszczony.If the buffer contains multiple data messages, for example, you need to loop until all of them are read and the buffer is cleared. W przeciwnym razie Twoje następne powiadomienie o otrzymaniu danych może być nieczasowo opóźnione.Otherwise, your next notification that there is data to be received may be indefinitely delayed. Użyj IsBufferEmpty , aby upewnić się, że pobierasz wszystkie dane.Use IsBufferEmpty to assure that you retrieve all data.

Artykuł Windows Sockets: Sekwencja operacji ilustruje obie strony tego procesu za pomocą przykładowego kodu.The article Windows Sockets: Sequence of Operations illustrates both sides of this process with example code.

Aby uzyskać więcej informacji, zobacz:For more information, see:

Zobacz teżSee also

Windows Sockets w MFCWindows Sockets in MFC
CSocket:: CreateCSocket::Create