Udostępnij za pośrednictwem


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 zapewnia dostęp do CArchiveprogramu , który zarządza wieloma aspektami komunikacji, które należy wykonać samodzielnie przy użyciu nieprzetworzonego interfejsu API lub klasy CAsyncSocket.

Napiwek

Klasę można używać samodzielnie CSocket , jako wygodniejszej CAsyncSocketwersji programu , ale najprostszym modelem programowania jest 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). Na przykład kod zawiera artykuł Windows Sockets: Sequence of Operations and Windows Sockets: Example of Sockets Using Archives (Gniazda systemu Windows: sekwencja operacji i gniazd 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

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.

Napiwek

W czasie wykonywania aplikacja serwera zwykle zaczyna być gotowa i "nasłuchiwanie", 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 GNIAZDA .

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

    Uwaga

    CArchive nie działa z gniazdami datagramu. Jeśli chcesz użyć CSocket w przypadku gniazda datagramu, musisz użyć klasy CAsyncSocket, czyli bez archiwum. Ponieważ datagramy są zawodne (nie gwarantuje przybycia i mogą być powtarzane lub poza sekwencją), nie są one zgodne z serializacji za pośrednictwem archiwum. Oczekuje się, że operacja serializacji zakończy się niezawodnie i w sekwencji. Jeśli spróbujesz użyć CSocket obiektu CArchive dla datagramu, asercji MFC zakończy się niepowodzeniem.

  3. Jeśli gniazdo jest klientem, wywołaj metodę CAsyncSocket::Połączenie, 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

    Funkcja Accept składowa przyjmuje odwołanie do nowego, pustego CSocket obiektu jako parametru. Przed wywołaniem Acceptmetody należy skonstruować ten obiekt . 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 datagramu.

  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 obiekty archiwum, pliku gniazda i gniazda.

    Uwaga

    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 i bufor zostanie wyczyszczone. W przeciwnym razie następne powiadomienie o tym, że dane do odebrania mogą być opóźnione przez czas nieokreślony. Użyj IsBufferEmpty polecenia , 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 też

Gniazda systemu Windows w MFC
CSocket::Create