Udostępnij przez


Windows Sockets: Używanie gniazd z archiwami

W tym artykule opisano model programowania CSocket. Klasa CSocket dostarcza obsługę gniazd na wyższym poziomie abstrakcji niż klasa CAsyncSocket. CSocket używa wersji protokołu serializacji MFC do przekazywania danych do i z obiektu gniazda za pośrednictwem obiektu MFC CArchive . CSocket zapewnia blokowanie (podczas zarządzania przetwarzaniem w tle komunikatów systemu Windows) i umożliwia dostęp do CArchiveprogramu, który zarządza wieloma aspektami komunikacji, które trzeba wykonać samodzielnie przy użyciu bezpośredniego interfejsu API lub klasy CAsyncSocket.

Wskazówka

Klasy CSocket można używać samodzielnie jako wygodniejszej wersji CAsyncSocket, ale najprostszy model programowania to użycie CSocket z obiektem CArchive.

Aby uzyskać więcej informacji na temat sposobu działania implementacji gniazd z archiwami, zobacz Windows Sockets: How Sockets with Archives Work (Jak działają gniazda z archiwami). Dla przykładowego kodu zobacz Windows Sockets: Sequence of Operations i Windows Sockets: Example of Sockets Using Archives (Gniazda systemu Windows: sekwencja operacji oraz gniazda systemu Windows: przykład gniazd korzystających z archiwów). Aby uzyskać informacje o niektórych funkcjach, które można uzyskać, wyprowadzając własne klasy z klas gniazd, zobacz Windows Sockets: Wyprowadzanie z klas gniazd.

Uwaga / Notatka

Jeśli piszesz program kliencki MFC do komunikowania się z ustalonymi serwerami (innych niż MFC), nie wysyłaj obiektów języka C++ za pośrednictwem archiwum. Jeśli serwer nie jest aplikacją MFC, która rozumie rodzaje obiektów, które chcesz wysłać, nie będzie mogła odbierać i deserializować obiektów. Aby uzyskać powiązane materiały na temat komunikowania się z aplikacjami innych niż MFC, zobacz również artykuł Windows Sockets: Porządkowanie bajtów.

Model programowania CSocket

CSocket Używanie obiektu obejmuje tworzenie i kojarzenie ze sobą kilku obiektów klas MFC. W poniższej procedurze ogólnej każdy krok jest wykonywany zarówno przez gniazdo serwera, jak i gniazdo klienta, z wyjątkiem kroku 3, w którym każdy typ gniazda wymaga innej akcji.

Wskazówka

Podczas działania aplikacja serwera zwykle uruchamiana jest jako pierwsza, aby być gotowa i nasłuchiwać, gdy aplikacja kliencka szuka połączenia. 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.

Aby skonfigurować komunikację między gniazdem serwera a gniazdem klienta

  1. Konstruowanie obiektu CSocket .

  2. Użyj obiektu, aby utworzyć bazowy uchwyt SOCKET.

    CSocket W przypadku obiektu klienta należy zwykle używać domyślnych parametrów do tworzenia, chyba że potrzebujesz gniazda datagramowego. CSocket W przypadku obiektu serwera należy określić port w wywołaniu Create .

    Uwaga / Notatka

    CArchive nie działa z gniazdami typu datagram. Jeśli chcesz użyć CSocket do gniazda datagramowego, musisz użyć klasy CAsyncSocket, to znaczy bez archiwizacji. Ponieważ datagramy są zawodne (nie ma gwarancji ich dostarczenia i mogą być powtarzane lub w niewłaściwej kolejności), nie są zgodne z serializacją przez archiwum. Oczekujesz, że operacja serializacji zakończy się niezawodnie i w odpowiedniej kolejności. Jeśli spróbujesz użyć CSocket z obiektem CArchive dla datagramu, asercja MFC się nie powiedzie.

  3. Jeśli gniazdo jest klientem, wywołaj metodę CAsyncSocket::Connect , aby połączyć obiekt gniazda z gniazdem serwera.

    — lub —

    Jeśli gniazdo jest serwerem, wywołaj metodę CAsyncSocket::Listen , aby rozpocząć nasłuchiwanie prób nawiązania połączenia od klienta. Po otrzymaniu żądania połączenia zaakceptuj je, wywołując metodę CAsyncSocket::Accept.

    Uwaga / Notatka

    Funkcja składowa Accept przyjmuje odwołanie do nowego, pustego obiektu CSocket jako jego parametru. Należy skonstruować ten obiekt przed wywołaniem metody Accept. Jeśli ten obiekt gniazda wykracza poza zakres, połączenie zostanie zamknięte. Nie należy wywoływać Create tego nowego obiektu gniazda.

  4. Utwórz obiekt CSocketFile , kojarząc CSocket z nim obiekt.

  5. Utwórz obiekt CArchive na potrzeby ładowania (odbierania) lub przechowywania (wysyłania) danych. Archiwum jest skojarzone z obiektem CSocketFile .

    Należy pamiętać, że CArchive nie działa z gniazdami datagramów.

  6. CArchive Użyj obiektu , aby przekazać dane między gniazdami klienta i serwera.

    Należy pamiętać, że dany CArchive obiekt przenosi dane tylko w jednym kierunku: na potrzeby ładowania (odbierania) lub przechowywania (wysyłania). W niektórych przypadkach użyjesz dwóch CArchive obiektów: jeden do wysyłania danych, drugi do odbierania potwierdzenia.

    Po zaakceptowaniu połączenia i skonfigurowaniu archiwum można wykonywać takie zadania jak weryfikowanie haseł.

  7. Zniszcz archiwum, plik gniazda i obiekty gniazda.

    Uwaga / Notatka

    Klasa CArchive dostarcza funkcję składową IsBufferEmpty specjalnie do użycia z klasą CSocket. Jeśli bufor zawiera wiele komunikatów danych, na przykład należy wykonać pętlę, dopóki wszystkie z nich nie zostaną odczytane, a bufor zostanie wyczyszczony. W przeciwnym razie następne powiadomienie o tym, że są dane do odebrania, może być opóźnione przez czas nieokreślony. Użyj IsBufferEmpty, aby zapewnić pobranie wszystkich danych.

Artykuł Windows Sockets: Sequence of Operations ilustruje obie strony tego procesu z przykładowym kodem.

Aby uzyskać więcej informacji, zobacz:

Zobacz także

Windows Sockets w MFC
CSocket::Create