Сокеты 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
Использование CAsyncSocket
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: порты и адреса сокетов.
Если сокет является клиентом, подключите объект сокета к сокету сервера с помощью
CAsyncSocket::Connect
.или
Если сокет является сервером, установите сокет для начала прослушивания (с
CAsyncSocket::Listen
) для попыток подключения от клиента. После получения запроса на подключение примите его.CAsyncSocket::Accept
После принятия подключения можно выполнять такие задачи, как проверка паролей.
Примечание.
Функция-член
Accept
принимает ссылку на новый пустойCSocket
объект в качестве параметра. Перед вызовомAccept
необходимо создать этот объект. Если этот объект сокета выходит из область, соединение закрывается. Не вызывайтеCreate
этот новый объект сокета. Пример см. в статье "Сокеты Windows: последовательность операций".Выполняйте обмен данными с другими сокетами, вызывая
CAsyncSocket
функции-члены объекта, которые инкапсулируют функции API сокетов Windows.См. спецификацию и класс
CAsyncSocket
сокетов Windows в справочнике по MFC.CAsyncSocket
Уничтожить объект.Если вы создали объект сокета в стеке, его деструктор вызывается, когда содержащая функция выходит из область. Если вы создали объект сокета в куче, используя
new
оператор, вы несете ответственность за использованиеdelete
оператора для уничтожения объекта.Деструктор вызывает функцию-член объекта
Close
перед уничтожением объекта.
Пример этой последовательности в коде (фактически для CSocket
объекта) см. в разделе Сокеты Windows: последовательность операций.
Ваши обязанности с CAsyncSocket
При создании объекта класса CAsyncSocket
объект инкапсулирует дескриптор Windows SOCKET
и предоставляет операции с этим дескриптором. При использовании CAsyncSocket
необходимо решить все проблемы, которые могут возникнуть при использовании API напрямую. Например:
Сценарии блокировки.
Различия порядка байтов между отправкой и получением компьютеров.
Преобразование между строками Юникода и многобайтового набора символов (МБ CS).
Определения этих терминов и дополнительные сведения см. в статье "Сокеты Windows: блокировка, сокеты Windows: порядок байтов, сокеты Windows: преобразование строк".
Несмотря на эти проблемы, класс CAsyncSocket
может быть правильным выбором для вас, если ваше приложение требует всей гибкости и контроля, которые вы можете получить. Если нет, попробуйте использовать вместо него класс CSocket
. CSocket
скрывает множество сведений от вас: он насосирует сообщения Windows во время блокирующих вызовов и предоставляет доступ к CArchive
, который управляет различиями порядка байтов и преобразованием строк.
Дополнительные сведения см. в разделе: