Сокеты Windows. Использование сокетов с архивами

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

Совет

Класс можно использовать CSocket самостоятельно, как более удобную версию CAsyncSocket, но простейшая модель программирования — использовать CSocket с CArchive объектом.

Дополнительные сведения о том, как работает реализация сокетов с архивами, см. в разделе "Сокеты Windows: как сокеты с помощью архивов работают". Пример кода см. в разделе "Сокеты Windows: последовательность операций и сокетов Windows": пример сокетов с помощью архивов. Сведения о некоторых функциональных возможностях, которые можно получить, выпроизводя собственные классы из классов сокетов, см. в разделе Сокеты Windows: производные от классов сокетов.

Примечание.

Если вы пишете клиентную программу MFC для взаимодействия с установленными (не MFC) серверами, не отправляйте объекты C++ через архив. Если сервер не является приложением MFC, которое понимает типы объектов, которые вы хотите отправить, он не сможет получать и десериализировать объекты. Связанные материалы по теме общения с приложениями, отличными от MFC, также см. в статье "Сокеты Windows: порядок байтов".

Модель программирования CSocket

CSocket Использование объекта включает создание и связывание нескольких объектов класса MFC. В приведенной ниже процедуре каждый шаг выполняется как сокетом сервера, так и сокетом клиента, за исключением шага 3, в котором для каждого типа сокета требуется другое действие.

Совет

Во время выполнения серверное приложение обычно начинает быть готовым и прослушивать, когда клиентское приложение ищет подключение. Если сервер не готов, когда клиент пытается подключиться, обычно требуется, чтобы пользовательское приложение пыталось снова подключиться позже.

Настройка связи между сокетом сервера и сокетом клиента

  1. Создайте объект CSocket.

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

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

    Примечание.

    CArchive не работает с сокетами диаграммы данных. Если вы хотите использовать CSocket для сокета диаграммы данных, необходимо использовать класс как можно использовать CAsyncSocket, то есть без архива. Так как диаграммы данных являются ненадежными (не гарантируется прибыть и могут повторяться или не будут повторяться), они несовместимы с сериализацией через архив. Ожидается, что операция сериализации будет выполнена надежно и последовательно. Если вы пытаетесь использовать CSocket с CArchive объектом для диаграммы данных, утверждение MFC завершается сбоем.

  3. Если сокет является клиентом, вызовите CAsyncSocket::Подключение для подключения объекта сокета к сокету сервера.

    или

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

    Примечание.

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

  4. Создайте объект CSocketFile, связав CSocket его с ним.

  5. Создайте объект CArchive для загрузки (получения) или хранения (отправки) данных. Архив связан с CSocketFile объектом.

    Помните, что CArchive не работает с сокетами диаграммы данных.

  6. CArchive Используйте объект для передачи данных между сокетами клиента и сервера.

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

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

  7. Уничтожить архив, файл сокета и объекты сокета.

    Примечание.

    Класс CArchive предоставляет функцию-член IsBufferEmpty специально для использования с классом CSocket. Если буфер содержит несколько сообщений данных, например, необходимо циклически, пока все из них не будут считываться, и буфер очищается. В противном случае следующее уведомление о том, что полученные данные могут быть отложены на неопределенный срок. Используйте IsBufferEmpty для обеспечения получения всех данных.

Статья Сокеты Windows: последовательность операций иллюстрирует обе стороны этого процесса с примером кода.

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

См. также

Сокеты Windows в MFC
CSocket::Create