Сокеты 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, в котором для каждого типа сокета требуется другое действие.
Совет
Во время выполнения серверное приложение обычно начинает быть готовым и прослушивать, когда клиентское приложение ищет подключение. Если сервер не готов, когда клиент пытается подключиться, обычно требуется, чтобы пользовательское приложение пыталось снова подключиться позже.
Настройка связи между сокетом сервера и сокетом клиента
Используйте объект для создания базового дескриптора SOCKET .
Для клиентского
CSocket
объекта обычно следует использовать параметры по умолчанию для создания, если не требуется сокет диаграммы данных.CSocket
Для объекта сервера необходимо указать порт в вызовеCreate
.Примечание.
CArchive
не работает с сокетами диаграммы данных. Если вы хотите использоватьCSocket
для сокета диаграммы данных, необходимо использовать класс как можно использоватьCAsyncSocket
, то есть без архива. Так как диаграммы данных являются ненадежными (не гарантируется прибыть и могут повторяться или не будут повторяться), они несовместимы с сериализацией через архив. Ожидается, что операция сериализации будет выполнена надежно и последовательно. Если вы пытаетесь использоватьCSocket
сCArchive
объектом для диаграммы данных, утверждение MFC завершается сбоем.Если сокет является клиентом, вызовите CAsyncSocket::Подключение для подключения объекта сокета к сокету сервера.
или
Если сокет является сервером, вызовите CAsyncSocket::Listen , чтобы начать прослушивание попыток подключения от клиента. После получения запроса на подключение примите его, вызвав CAsyncSocket::Accept.
Примечание.
Функция-член
Accept
принимает ссылку на новый пустойCSocket
объект в качестве параметра. Перед вызовомAccept
необходимо создать этот объект. Если этот объект сокета выходит из область, соединение закрывается. Не вызывайтеCreate
этот новый объект сокета.Создайте объект CSocketFile, связав
CSocket
его с ним.Создайте объект CArchive для загрузки (получения) или хранения (отправки) данных. Архив связан с
CSocketFile
объектом.Помните, что
CArchive
не работает с сокетами диаграммы данных.CArchive
Используйте объект для передачи данных между сокетами клиента и сервера.Помните, что заданный
CArchive
объект перемещает данные только в одном направлении: для загрузки (получения) или хранения (отправки). В некоторых случаях вы будете использовать дваCArchive
объекта: один для отправки данных, другой — для получения подтверждения.После принятия подключения и настройки архива можно выполнять такие задачи, как проверка паролей.
Уничтожить архив, файл сокета и объекты сокета.
Примечание.
Класс
CArchive
предоставляет функцию-членIsBufferEmpty
специально для использования с классомCSocket
. Если буфер содержит несколько сообщений данных, например, необходимо циклически, пока все из них не будут считываться, и буфер очищается. В противном случае следующее уведомление о том, что полученные данные могут быть отложены на неопределенный срок. ИспользуйтеIsBufferEmpty
для обеспечения получения всех данных.
Статья Сокеты Windows: последовательность операций иллюстрирует обе стороны этого процесса с примером кода.
Дополнительные сведения см. в разделе: