Поделиться через


Класс CSocketFile

Объект CFile , используемый для отправки и получения сведений по сети с помощью Windows Sockets.

Синтаксис

class CSocketFile : public CFile

Участники

Открытые конструкторы

Имя Описание
CSocketFile::CSocketFile Формирует объект CSocketFile.

Замечания

Объект можно прикрепить к объекту CSocketFileCSocket для этой цели. Вы также можете, как правило, подключить CSocketFile объект к CArchive объекту, чтобы упростить отправку и получение данных с помощью сериализации MFC.

Чтобы сериализовать (отправить) данные, вставьте его в архив, который вызывает CSocketFile функции-члены для записи данных в CSocket объект. Для десериализации (получения) данных извлекается из архива. Это приводит к тому, что архив вызывает CSocketFile функции-члены для чтения данных из CSocket объекта.

Совет

Помимо использования CSocketFile , как описано здесь, его можно использовать как автономный файловый объект, как можно с CFileего базовым классом. Можно также использовать CSocketFile с любыми функциями сериализации MFC на основе архива. Так как CSocketFile не поддерживает все CFileфункции, некоторые функции сериализации MFC по умолчанию несовместимы с CSocketFile. Это особенно верно для CEditView класса. Вместо этого не следует пытаться сериализовать CEditView данные с помощью объекта, присоединенного CArchive к объектуCSocketFile, используйте CEditView::SerializeRawCEditView::Serialize вместо этого. Функция SerializeRaw ожидает, что объект файла имеет такие функции, как, например Seek, CSocketFile не имеет.

При использовании CArchive и CSocketFileCSocketможет возникнуть ситуация, когда CSocket::Receive введите цикл (по PumpMessages(FD_READ)) ожидая запрошенного количества байтов. Это связано с тем, что сокеты Windows разрешают только один вызов recv для каждого уведомления FD_READ, но CSocketFile и CSocket разрешают несколько вызовов для пересчета на FD_READ. Если вы получаете FD_READ, когда нет данных для чтения, приложение зависает. Если вы никогда не получаете еще одну FD_READ, приложение перестает взаимодействовать по сокету.

Эту проблему можно устранить следующим образом. В методе OnReceive класса сокета вызовите перед вызовом CAsyncSocket::IOCtl(FIONREAD, ...)Serialize метода класса сообщений, когда ожидаемые данные из сокета превышают размер одного TCP-пакета (максимальная единица передачи сетевого носителя, обычно не менее 1096 байт). Если размер доступных данных меньше необходимости, дождитесь получения всех данных и только затем запустите операцию чтения.

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

void CChatSocket::OnReceive(int nErrorCode)
{
   CSocket::OnReceive(nErrorCode);

   DWORD dwReceived;

   if (IOCtl(FIONREAD, &dwReceived))
   {
      if (dwReceived >= m_dwExpected) // Process only if you have enough data
         m_pDoc->ProcessPendingRead();
   }
   else
   {
      // Error handling here
   }
}

Дополнительные сведения см. в статье "Сокеты Windows" в MFC, сокетах Windows: использование сокетов с архивами, а также API сокетов Windows 2.

Иерархия наследования

CObject

Cfile

CSocketFile

Требования

Заголовок: afxsock.h

CSocketFile::CSocketFile

Формирует объект CSocketFile.

explicit CSocketFile(
    CSocket* pSocket,
    BOOL bArchiveCompatible = TRUE);

Параметры

pSocket
Сокет для подключения к объекту CSocketFile .

bArchiveCompatible
Указывает, предназначен ли объект файла для использования с CArchive объектом. Передайте значение FALSE только в том случае, если вы хотите использовать CSocketFile объект в автономном CFile режиме, так как автономный объект с определенными ограничениями. Этот флаг изменяет, как CArchive объект, подключенный к CSocketFile объекту, управляет буфером для чтения.

Замечания

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

Примечание.

Можно CSocketFile также использовать в качестве (ограниченного CArchive ) файла без объекта. По умолчанию CSocketFile параметр bArchiveCompatible конструктора имеет значение TRUE. Это указывает, что объект файла предназначен для использования с архивом. Чтобы использовать объект файла без архива, передайте значение FALSE в параметре bArchiveCompatible .

В режиме "совместимого с архивом" CSocketFile объект обеспечивает более высокую производительность и снижает опасность "взаимоблокировки". Взаимоблокировка возникает, когда отправка и получение сокетов ожидает друг друга или для общего ресурса. Эта ситуация может произойти, если CArchive объект работал с CSocketFile тем, как он выполняется с CFile объектом. С помощью CFileархива можно предположить, что если он получает меньше байтов, чем запрошено, то достигнут конец файла.

Однако данные CSocketFileоснованы на сообщениях; буфер может содержать несколько сообщений, поэтому получение меньше количества запрошенных байтов не означает конец файла. Приложение не блокируется в этом случае, так как оно может использовать CFile, и оно может продолжать чтение сообщений из буфера до тех пор, пока буфер не будет пуст. Функция CArchive::IsBufferEmpty полезна для мониторинга состояния буфера архива в таком случае.

Дополнительные сведения об использовании CSocketFileсм. в статьях о сокетах Windows: использование сокетов с архивами и сокетами Windows: пример сокетов с помощью архивов.

См. также

Класс CFile
Диаграмма иерархии
Класс CAsyncSocket
Класс CSocket