Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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
Konstruowanie obiektu CSocket .
Użyj obiektu, aby utworzyć bazowy uchwyt SOCKET.
CSocketW przypadku obiektu klienta należy zwykle używać domyślnych parametrów do tworzenia, chyba że potrzebujesz gniazda datagramowego.CSocketW przypadku obiektu serwera należy określić port w wywołaniuCreate.Uwaga / Notatka
CArchivenie działa z gniazdami typu datagram. Jeśli chcesz użyćCSocketdo gniazda datagramowego, musisz użyć klasyCAsyncSocket, 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ćCSocketz obiektemCArchivedla datagramu, asercja MFC się nie powiedzie.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
Acceptprzyjmuje odwołanie do nowego, pustego obiektuCSocketjako jego parametru. Należy skonstruować ten obiekt przed wywołaniem metodyAccept. Jeśli ten obiekt gniazda wykracza poza zakres, połączenie zostanie zamknięte. Nie należy wywoływaćCreatetego nowego obiektu gniazda.Utwórz obiekt CSocketFile , kojarząc
CSocketz 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
CArchivenie działa z gniazdami datagramów.CArchiveUżyj obiektu , aby przekazać dane między gniazdami klienta i serwera.Należy pamiętać, że dany
CArchiveobiekt przenosi dane tylko w jednym kierunku: na potrzeby ładowania (odbierania) lub przechowywania (wysyłania). W niektórych przypadkach użyjesz dwóchCArchiveobiektó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 archiwum, plik gniazda i obiekty gniazda.
Uwaga / Notatka
Klasa
CArchivedostarcza funkcję składowąIsBufferEmptyspecjalnie 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żyjIsBufferEmpty, 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: