Поделиться через


Сокеты Windows: использование класса CAsyncSocket

В этой статье объясняется, как использовать класс CAsyncSocket. Этот класс инкапсулирует API сокетов Windows на очень низком уровне. CAsyncSocket используется программистами, которые подробно знают сетевое взаимодействие, но хотят удобства обратных вызовов для уведомления о сетевых событиях. На основе этого предположения эта статья содержит только основные инструкции. Возможно, следует рассмотреть возможность использования CAsyncSocket , если требуется простота работы сокетами Windows с несколькими сетевыми протоколами в приложении MFC, но не хотите жертвовать гибкостью. Вы также можете почувствовать, что вы можете повысить эффективность, запрограммируя обмен данными напрямую самостоятельно, чем вы могли бы использовать более общую альтернативную модель класса CSocket.

CAsyncSocketдокументируется в справочнике по MFC. Visual C++ также предоставляет спецификацию сокетов Windows, расположенную в пакете SDK для Windows. Вам осталось оставить сведения. Visual C++ не предоставляет пример приложения для CAsyncSocket.

Если вы не хорошо знакомы с сетевыми коммуникациями и хотите простое решение, используйте класс CSocket с CArchive объектом. Дополнительные сведения см. в статье "Сокеты Windows: использование сокетов с архивами ".

В этой статье рассматриваются следующие вопросы:

Создание и использование CAsyncSocket

Использование CAsyncSocket

  1. CAsyncSocket Создайте объект и используйте объект для создания базового SOCKET дескриптора.

    Создание сокета следует шаблону MFC двухэтапной конструкции.

    Например:

    CAsyncSocket sock;
    sock.Create(); // Use the default parameters
    

    или

    CAsyncSocket *pSocket = new CAsyncSocket;
    int nPort = 27;
    pSocket->Create(nPort, SOCK_DGRAM);
    

    Первый конструктор выше создает CAsyncSocket объект в стеке. Второй конструктор создает кучу CAsyncSocket . Первый вызов, приведенный Create выше, использует параметры по умолчанию для создания сокета потока. Второй Create вызов создает сокет диаграммы данных с указанным портом и адресом. (Вы можете использовать любую Create версию с помощью любого метода построения.)

    Параметры, которые необходимо выполнить Create :

    • "порт": короткое целое число.

      Для сокета сервера необходимо указать порт. Для сокета клиента обычно принимается значение по умолчанию для этого параметра, которое позволяет сокетам Windows выбрать порт.

    • Тип сокета: SOCK_STREAM (по умолчанию) или SOCK_DGRAM.

    • Сокет "адрес", например "ftp.microsoft.com" или "128.56.22.8".

      Это ip-адрес в сети. Вероятно, вы всегда будете полагаться на значение по умолчанию для этого параметра.

    Термины "порт" и "адрес сокета" описаны в сокетах Windows: порты и адреса сокетов.

  2. Если сокет является клиентом, подключите объект сокета к сокету сервера с помощью CAsyncSocket::Connect.

    или

    Если сокет является сервером, установите сокет для начала прослушивания (с CAsyncSocket::Listen) для попыток подключения от клиента. После получения запроса на подключение примите его.CAsyncSocket::Accept

    После принятия подключения можно выполнять такие задачи, как проверка паролей.

    Примечание.

    Функция-член Accept принимает ссылку на новый пустой CSocket объект в качестве параметра. Перед вызовом Acceptнеобходимо создать этот объект. Если этот объект сокета выходит из область, соединение закрывается. Не вызывайте Create этот новый объект сокета. Пример см. в статье "Сокеты Windows: последовательность операций".

  3. Выполняйте обмен данными с другими сокетами, вызывая CAsyncSocket функции-члены объекта, которые инкапсулируют функции API сокетов Windows.

    См. спецификацию и класс CAsyncSocket сокетов Windows в справочнике по MFC.

  4. CAsyncSocket Уничтожить объект.

    Если вы создали объект сокета в стеке, его деструктор вызывается, когда содержащая функция выходит из область. Если вы создали объект сокета в куче, используя new оператор, вы несете ответственность за использование delete оператора для уничтожения объекта.

    Деструктор вызывает функцию-член объекта Close перед уничтожением объекта.

Пример этой последовательности в коде (фактически для CSocket объекта) см. в разделе Сокеты Windows: последовательность операций.

Ваши обязанности с CAsyncSocket

При создании объекта класса CAsyncSocketобъект инкапсулирует дескриптор Windows SOCKET и предоставляет операции с этим дескриптором. При использовании CAsyncSocketнеобходимо решить все проблемы, которые могут возникнуть при использовании API напрямую. Например:

  • Сценарии блокировки.

  • Различия порядка байтов между отправкой и получением компьютеров.

  • Преобразование между строками Юникода и многобайтового набора символов (МБ CS).

Определения этих терминов и дополнительные сведения см. в статье "Сокеты Windows: блокировка, сокеты Windows: порядок байтов, сокеты Windows: преобразование строк".

Несмотря на эти проблемы, класс CAsyncSocket может быть правильным выбором для вас, если ваше приложение требует всей гибкости и контроля, которые вы можете получить. Если нет, попробуйте использовать вместо него класс CSocket . CSocket скрывает множество сведений от вас: он насосирует сообщения Windows во время блокирующих вызовов и предоставляет доступ к CArchive, который управляет различиями порядка байтов и преобразованием строк.

Дополнительные сведения см. в разделе:

См. также

Сокеты Windows в MFC