Windows Sockets: używanie klasy CAsyncSocket
W tym artykule wyjaśniono, jak używać klasy CAsyncSocket
. Ta klasa hermetyzuje interfejs API gniazd systemu Windows na bardzo 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, aby ułatwić sobie czynienia z wieloma protokołami sieciowymi w aplikacji MFC, ale nie chcesz poświęcać elastyczności. Możesz również zauważyć, że możesz uzyskać lepszą wydajność, programując komunikację bardziej bezpośrednio niż można użyć bardziej ogólnego alternatywnego modelu klasy CSocket
.
CAsyncSocket
dokument jest udokumentowany w dokumentacji 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. Visual C++ nie dostarcza przykładowej aplikacji dla programu 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 (Gniazda systemu Windows: używanie gniazd z archiwami ).
Ten artykuł dotyczy:
Tworzenie i używanie
CAsyncSocket
obiektu.
Tworzenie i używanie elementu CAsyncSocket
Aby użyć CAsyncSocket
Skonstruuj
CAsyncSocket
obiekt i użyj obiektu, aby utworzyć dojście bazoweSOCKET
.Tworzenie gniazda jest zgodne ze wzorcem MFC dwuetapowej konstrukcji.
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
CAsyncSocket
obiekt na stosie. Drugi konstruktor tworzyCAsyncSocket
stertę. PierwszeCreate
wywołanie powyżej używa domyślnych parametrów do utworzenia gniazda strumienia. DrugieCreate
wywołanie tworzy gniazdo datagramu z określonym portem i adresem. (Można użyć jednej z wersjiCreate
z jedną z metod budowlanych).Parametry, które mają
Create
być następujące:"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
.Gniazdo "adres", takie 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" są objaśnione w oknach Sockets: Porty i adresy gniazd.
Jeśli gniazdo jest klientem, połącz obiekt gniazda z gniazdem serwera przy użyciu polecenia
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 za pomocąCAsyncSocket::Accept
polecenia .Po zaakceptowaniu połączenia możesz wykonywać zadania, takie jak weryfikowanie haseł.
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. Aby zapoznać się z przykładem, zobacz artykuł Windows Sockets: Sequence of Operations (Gniazda systemu Windows: sekwencja operacji).Przekonuj komunikację z innymi gniazdami, wywołując
CAsyncSocket
funkcje członkowskie obiektu, które hermetyzują funkcje interfejsu API gniazd systemu Windows.Zobacz specyfikację i klasę
CAsyncSocket
Windows Sockets w dokumentacji MFC.Zniszczyć
CAsyncSocket
obiekt.Jeśli obiekt gniazda został utworzony na stosie, jego destruktor jest wywoływany, gdy funkcja zawierająca wykracza poza zakres. Jeśli obiekt gniazda został utworzony na stercie, używając
new
operatora, odpowiadasz za użyciedelete
operatora w celu zniszczenia obiektu.Destruktor wywołuje funkcję składową obiektu
Close
przed zniszczeniem obiektu.
Aby zapoznać się z przykładem tej sekwencji w kodzie (faktycznie dla CSocket
obiektu), zobacz Windows Sockets: Sequence of Operations (Gniazda systemu Windows: sekwencja operacji).
Twoje obowiązki CAsyncSocket
Podczas tworzenia obiektu klasy CAsyncSocket
obiekt hermetyzuje operacje obsługi i dostaw systemu Windows SOCKET
na tym dojściu. W przypadku korzystania z usługi CAsyncSocket
należy radzić sobie ze wszystkimi problemami, z którymi możesz się zmierzyć, jeśli korzystasz bezpośrednio z interfejsu API. Przykład:
Scenariusze "blokowania".
Różnice kolejności bajtów między maszynami wysyłającymi i odbierających.
Konwertowanie ciągów znaków Unicode i wielobajtowych (MBCS).
Aby uzyskać definicje tych terminów i dodatkowe informacje, zobacz Windows Sockets: Blocking, Windows Sockets: Byte Ordering, Windows Sockets: Converting Strings (Gniazda systemu Windows: blokowanie), Windows Sockets: Ordering Byte Ordering (Porządkowanie bajtów): Windows Sockets: Converting Strings (Gniazda systemu Windows: konwertowanie ciągów).
Pomimo tych problemów klasa CAsyncSocket
może być właściwym wyborem, jeśli aplikacja wymaga całej elastyczności i kontroli, którą 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
programu , który zarządza różnicami kolejności bajtów i konwersją ciągów.
Aby uzyskać więcej informacji, zobacz:
- Gniazda systemu Windows: podstawy\
- Gniazda systemu Windows: gniazda strumieni\
- Gniazda systemu Windows: gniazda do przesyłania datagramów