Сокеты Windows. Работа сокетов с архивами
В этой статье описывается, как объект CSocket, объект CSocketFile, а объект CArchive объединяются для упрощения отправлять и получать данные через сокет Windows.
На статью Windows SSL. Пример с помощью сокетов архивы представляет функцию PacketSerialize. Объект архива в примере PacketSerialize работает во многом аналогично архива объект, переданный функции MFC Выполнять сериализацию. Основная разница, как для сокетов, архив не вложена в стандартный объект CFile (как правило, связанный с дисковым файлом), но к объекту CSocketFile. Вместо подключение к дисковому файлу, объект CSocketFile подключается к CSocket объект.
Объект CArchive управляет буфером. Если буфер расположении () отправя архива заполнен, связанный объект CFile записывает содержимое буфера. Очистка буфера архива вложенного сокета эквивалентен отправить сообщение. Если буфер архива загрузки (получение) заполнен, объект CFile останавливает чтения до тех пор, пока буфер не будет доступен еще раз.
Класс CSocketFile выходные данные CFile, но не поддерживает функции-члены CFile, такие как функции размещения (Seek, GetLength, SetLength и т д), блокируя функции (LockRange, UnlockRange), или функция GetPosition. Весь объект CSocketFile должен для записи или чтения последовательности байтов на или из связанного объекта CSocket. Поскольку файл не включен, такие операции, как Seek и GetPosition не делают имеет смысл. CSocketFile является производным от CFile, поэтому он обычно унаследовал бы всех этих функций-членов. Чтобы этого избежать, неподдерживаемые функции-члены CFile переопределены в CSocketFile генерирует CNotSupportedException.
Объект CSocketFile вызывает функции-члены его объекта CSocket отправлять или получать данные.
На следующем рисунке показаны отношения между этих объектов сначала обеим сторонам сообщения.
CArchive CSocketFile CSocket, и
Цель этой ясной сложности на экране самостоятельно от необходимости подробностями сокета. Создается сокет, файл и архивируйте, а затем разработке отправка или получение данных, вставляя их в архив или извлечь его из архива. CArchiveCSocket, CSocketFile и управляют сведения в фоновом режиме.
Объект CSocket фактически 2 — объект состояния: иногда асинхронный (обычное состояние) и иногда синхронный. При асинхронном состоянии асинхронных сокет, может получать уведомления от платформы. Однако во время операции, такие как получение или отправлять данные сокет является синхронным. Это означает, что сокет не получит более новых асинхронных уведомления до тех пор, пока синхронная операция не будут завершены. Поскольку переключает режимы, можно, например, сделайте примерно следующим образом:
void CMySocket::OnReceive(int nErrorCode)
{
if (0 == nErrorCode)
{
CSocketFile file(this);
CArchive ar(&file, CArchive::load);
CString str;
ar >> str;
}
}
Если CSocket не было реализовано в виде объекта 2 — состояния, может быть возможно получить дополнительные уведомления для одного и того же типа событий во время обрабатываются предыдущее уведомление. Например, можно получать уведомления OnReceive при обработке OnReceive. Во фрагменте кода выше, извлечение str из архива может привести к рекурсии. Переключение состояния, CSocket предотвращает рекурсии, запретив дополнительные уведомления. Общее правило не уведомления внутри уведомлений.
Примечание
CSocketFile также можно использовать как файл a (без ограничений) объекта CArchive.По умолчанию параметр bArchiveCompatible конструктора CSocketFileTRUE.Указывает, что объект файла для использования с архивом.Для использования объекта без файла архива укажите в параметре ЛОЖЬbArchiveCompatible.
В своем «режиме архива совместимом», объект CSocketFile обеспечивает большую производительность и уменьшает опасность «взаимоблокировки». Взаимоблокировка возникает, когда и отправя и при получении сокеты ожидают друг друга, или находится в ожидании общий ресурс. Такая ситуация может возникнуть, если объект CArchive выполненный с CSocketFile образом создается с объектом CFile. С CFile, достигался архив может высказывать, если получает меньше байтов, чем спросила, конец файла. С CSocketFile, однако данные сообщение на основе; буфер может содержать несколько сообщений, поэтому получение, чем запрошенное число байтов не означает конец файла. Приложение не блокирует в этом случае, как оно может с CFile и может продолжать считывать сообщения из буфера до тех пор, пока буфер не будет пустым. Функция IsBufferEmpty в CArchive полезна для отслеживания состояния буфера архива в таком случае.
Дополнительные сведения см. в разделе Windows SSL. С помощью сокетов с архивами.