Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Windows Sockets: używanie klasy
W tym artykule wyjaśniono, jak używać klasy CAsyncSocket
. Ta klasa hermetyzuje interfejs API gniazd systemu Windows na niskim poziomie.
CAsyncSocket
jest używany przez programistów, którzy znają szczegółowo komunikację sieciową, ale chcą wygody wywołań zwrotnych dla powiadomień o zdarzeniach sieciowych. Na podstawie tego założenia ten artykuł zawiera tylko podstawowe instrukcje. Prawdopodobnie warto rozważyć użycie CAsyncSocket
, jeśli chcesz łatwość obsługi wielu protokołów sieciowych w aplikacji MFC, ale nie chcesz poświęcać elastyczności. Możesz odnieść wrażenie, że uzyskasz lepszą wydajność, programując komunikację bardziej bezpośrednio samodzielnie niż korzystając z bardziej ogólnego alternatywnego modelu klasy CSocket
.
CAsyncSocket
jest udokumentowany w referencji MFC. Język Visual C++ udostępnia również specyfikację windows Sockets znajdującą się w zestawie Windows SDK. Szczegóły są dla Ciebie pozostawione. Program Visual C++ nie dostarcza przykładowej aplikacji dla CAsyncSocket
.
Jeśli nie masz dużej wiedzy na temat komunikacji sieciowej i potrzebujesz prostego rozwiązania, użyj klasy CSocket
z obiektem CArchive
. Aby uzyskać więcej informacji, zobacz Windows Sockets: Using Sockets with Archives (Używanie gniazd z archiwami).
Ten artykuł dotyczy:
Tworzenie i używanie obiektu
CAsyncSocket
.
Tworzenie i używanie CAsyncSocket
Aby użyć CAsyncSocket
Skonstruuj obiekt
CAsyncSocket
i użyj obiektu do utworzenia bazowego uchwytuSOCKET
.Tworzenie gniazda sieciowego jest zgodne ze wzorcem MFC dwuetapowej budowy.
Na przykład:
CAsyncSocket sock; sock.Create(); // Use the default parameters
— lub —
CAsyncSocket *pSocket = new CAsyncSocket; int nPort = 27; pSocket->Create(nPort, SOCK_DGRAM);
Pierwszy konstruktor powyżej tworzy obiekt
CAsyncSocket
na stosie. Drugi konstruktor tworzyCAsyncSocket
na stercie. Pierwsze wywołanieCreate
powyżej używa domyślnych parametrów do utworzenia gniazda strumieniowego. Drugie wywołanieCreate
tworzy gniazdo datagramu z określonym portem i adresem. (Możesz użyć wersjiCreate
z dowolną metodą budowy.)Parametry dla
Create
to:"port": krótka liczba całkowita.
W przypadku gniazda serwera należy określić port. W przypadku gniazda klienta zazwyczaj akceptujesz wartość domyślną dla tego parametru, co umożliwia wybranie portu przez gniazda systemu Windows.
Typ gniazda:
SOCK_STREAM
(wartość domyślna) lubSOCK_DGRAM
.Adres gniazda, taki jak
"ftp.microsoft.com"
lub"128.56.22.8"
.Jest to adres IP (Internet Protocol) w sieci. Prawdopodobnie zawsze będziesz polegać na wartości domyślnej dla tego parametru.
Terminy "port" i "adres gniazda" zostały wyjaśnione w Windows Sockets: Porty i adresy gniazd.
Jeśli gniazdo jest klientem, połącz obiekt gniazda z gniazdem serwera przy użyciu
CAsyncSocket::Connect
.— lub —
Jeśli gniazdo jest serwerem, ustaw gniazdo, aby rozpocząć nasłuchiwanie (z
CAsyncSocket::Listen
) dla prób nawiązania połączenia z klientem. Po otrzymaniu żądania połączenia zaakceptuj je przy użyciuCAsyncSocket::Accept
.Po zaakceptowaniu połączenia możesz wykonywać zadania, takie jak weryfikowanie haseł.
Uwaga
Funkcja składowa
Accept
przyjmuje odwołanie do nowego, pustego obiektuCSocket
jako 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ćCreate
dla tego nowego obiektu gniazda. Aby zapoznać się z przykładem, zobacz artykuł Windows Sockets: Sequence of Operations.Przeprowadzaj komunikację z innymi gniazdami, wywołując metody obiektu
CAsyncSocket
, które zawierają funkcje interfejsu API gniazd systemu Windows.Zobacz specyfikację Windows Sockets i klasę
CAsyncSocket
w dokumentacji MFC .Zniszczyć obiekt
CAsyncSocket
.Jeśli obiekt gniazda został utworzony na stosie, jego destruktor jest wywoływany, gdy funkcja kończy swoje działanie. Jeśli obiekt gniazda został utworzony na stercie, używając operatora
new
, odpowiadasz za użycie operatoradelete
w celu zniszczenia obiektu.Destruktor wywołuje składową funkcję obiektu
Close
przed jego zniszczeniem.
Aby zapoznać się z przykładem tej sekwencji w kodzie (faktycznie dla obiektu CSocket
), zobacz Windows Sockets: Sequence of Operations.
Twoje obowiązki związane z CAsyncSocket
Kiedy tworzysz obiekt klasy CAsyncSocket
, obiekt hermetyzuje uchwyt Windows SOCKET
i dostarcza operacje na tym uchwycie. Jeśli używasz CAsyncSocket
, musisz radzić sobie ze wszystkimi problemami, z którymi możesz się zmierzyć, jeśli korzystasz bezpośrednio z interfejsu API. Na przykład:
Scenariusze "blokowania".
Różnice kolejności bajtów między maszynami wysyłającymi i odbierających.
Konwertowanie pomiędzy ciągami znaków Unicode a ciągami znaków z wielobajtowym zestawem znaków (MBCS).
Aby uzyskać definicje tych terminów i dodatkowe informacje, zobacz Windows Sockets: Blocking, Windows Sockets: Byte Ordering, Windows Sockets: Converting Strings.
Pomimo tych problemów, klasa CAsyncSocket
może być właściwym wyborem, jeśli Twoja aplikacja wymaga maksymalnej elastyczności i kontroli, jaką możesz uzyskać. Jeśli nie, rozważ użycie klasy CSocket
.
CSocket
ukrywa wiele szczegółów: przekazuje komunikaty systemu Windows podczas blokowania wywołań i zapewnia dostęp do CArchive
, który zarządza różnicami kolejności bajtów i konwersją ciągów.
Aby uzyskać więcej informacji, zobacz: