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 CArchive
programu , 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 CAsyncSocket
wersji 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
Konstruowanie obiektu CSocket .
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łaniuCreate
.Uwaga
CArchive
nie działa z gniazdami datagramu. Jeśli chcesz użyćCSocket
w przypadku gniazda datagramu, musisz użyć klasyCAsyncSocket
, 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
obiektuCArchive
dla datagramu, asercji MFC zakończy się niepowodzeniem.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, pustegoCSocket
obiektu jako parametru. Przed wywołaniemAccept
metody 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.Utwórz obiekt CSocketFile, kojarząc
CSocket
z nim obiekt.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.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óchCArchive
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ł.
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żyjIsBufferEmpty
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: