Udostępnij za pośrednictwem


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

Aby użyć CAsyncSocket

  1. Skonstruuj obiekt CAsyncSocket i użyj obiektu do utworzenia bazowego uchwytu SOCKET.

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

  2. 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życiu CAsyncSocket::Accept.

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

    Uwaga

    Funkcja składowa Accept przyjmuje odwołanie do nowego, pustego obiektu CSocket jako jego parametru. Należy skonstruować ten obiekt przed wywołaniem metody Accept. 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.

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

  4. 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 operatora delete 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:

Zobacz też

Windows Sockets w MFC