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 elementu CAsyncSocket

Aby użyć CAsyncSocket

  1. Skonstruuj CAsyncSocket obiekt i użyj obiektu, aby utworzyć dojście bazowe SOCKET .

    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 tworzy CAsyncSocket stertę. Pierwsze Create wywołanie powyżej używa domyślnych parametrów do utworzenia gniazda strumienia. Drugie Create wywołanie tworzy gniazdo datagramu z określonym portem i adresem. (Można użyć jednej z wersji Create 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) lub SOCK_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.

  2. 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::Acceptpolecenia .

    Po zaakceptowaniu połączenia możesz wykonywać zadania, takie jak weryfikowanie haseł.

    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. Aby zapoznać się z przykładem, zobacz artykuł Windows Sockets: Sequence of Operations (Gniazda systemu Windows: sekwencja operacji).

  3. 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.

  4. 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życie delete 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 CAsyncSocketobiekt hermetyzuje operacje obsługi i dostaw systemu Windows SOCKET na tym dojściu. W przypadku korzystania z usługi CAsyncSocketnależ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 CArchiveprogramu , który zarządza różnicami kolejności bajtów i konwersją ciągów.

Aby uzyskać więcej informacji, zobacz:

Zobacz też

Gniazda systemu Windows w MFC