Windows sockets: Как работают с архивами сокета
В этой статье описывается, как объект CSocket объект CSocketFile и объект CArchive объединяются для упрощения отправлять и получать данные через сокет windows.
На статью Windows sockets: Пример сокетов использование файлов представляет функцию PacketSerialize.Объект архива в примере PacketSerialize работает аналогично объект архива, передаваемый функции MFC Serialize.Основная разница то для сокетов, архив вложенна не к стандартному объекту CFile (как правило, связанный с файлом на диске), но к объекту CSocketFile.Вместо подключение к файлу на диске, объект CSocketFile подключается к CSocket объект.
Объект CArchive управляет буфером.Если буфер заполнен, отправляющий архива () связанного объекта CFile записывает содержимое буфера.Очистка буфера архива вложенного в гнезду эквивалентен отправить сообщение.Если буфер полон архива загрузки (get), CFile останавливает объект чтения до тех пор, пока буфер не будет доступен.
Класс CSocketFile является производным от CFile, но он не поддерживает функции-члены CFile как функции размещения (Seek, GetLength, SetLength и т д), блокируя функции (LockRange, UnlockRange) или функция GetPosition.Весь объект CSocketFile должен сделать записи или чтения последовательности байтов или из связанного объекта CSocket.Поскольку файл не включен, и операции, такие как SeekGetPosition нет никакого смысла.CSocketFile является производным от CFile, поэтому она обычно наследовало бы всех этих функций-членов.Чтобы избежать этого, неподдерживаемые функции элементов CFile переопределении в CSocketFile для вызова CNotSupportedException.
Функции-члены вызовов объекта CSocketFile его объекта CSocket отправлять и получать данные.
На следующем рисунке показана связь между этих объектов с обеих сторон сообщения.
CArchive CSocketFile CSocket, и
Цель этого ясной сложности на экран от необходимости самостоятельно управлять информация сокета.Создается, когда сокет, файл и файл, а затем начала отправки или приема данных с его вставки в архив или извлечь его из архива.CArchive, CSocketFile и управляют сведения CSocket незаметно для пользователя.
Объект CSocket является виртуальным объектом 2 состояний: иногда асинхронная (обычном состоянии) и иногда в синхронном режиме.В асинхронном состоянии, сокет может получить асинхронные уведомления от платформы.Однако во время операций, таких как get или отправлять данные сокет является синхронным.Это означает, что у сокета не получит никаких более добавочные асинхронные уведомления до тех пор, пока синхронная операция не завершается.Переключение режимов, поскольку он позволяет, например, выполнять следующим образом:
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 также может использоваться в файле (ограниченный) без объекта CArchive.По умолчанию параметр bArchiveCompatible конструктора CSocketFileИстина.Это указывает на то, что объект файла для использования компоновки.Чтобы использовать объект файла без архива, передайте Ложь в параметре bArchiveCompatible. |
В режиме, совместимом «архива» объект CSocketFile обеспечивает более высокую производительность и уменьшает опасность «взаимоблокировок». Взаимоблокировка возникает, когда и отправляющее и принимающее сокета ожидают друг от друга или ожидает общий ресурс.Такая ситуация может возникнуть, если объект CArchive выполненный с CSocketFile образом, то она выполняется с объектом CFile.С CFile, достигнут архив может предполагать, что если он возвращает меньшее число байтов, чем запрашивается, конец файла.С CSocketFile, однако данные на основе сообщение; буфер может содержать несколько сообщений, поэтому получение меньше, чем количество запрошенных байтов не означает конец файла.Приложение не блокирует в этом случае, так как они могут с CFile и может продолжать считывать сообщения из буфера до тех пор, пока буфер не будет пустым.Функция IsBufferEmpty в CArchive полезна для контроля состояния буфера архива в таком случае.
Дополнительные сведения см. в разделе Windows sockets: Использование сокета с архивами