Класс CSocketFile
Объект CFile
, используемый для отправки и получения сведений по сети с помощью Windows Sockets.
Синтаксис
class CSocketFile : public CFile
Участники
Открытые конструкторы
Имя | Описание |
---|---|
CSocketFile::CSocketFile | Формирует объект CSocketFile . |
Замечания
Объект можно прикрепить к объекту CSocketFile
CSocket
для этой цели. Вы также можете, как правило, подключить CSocketFile
объект к CArchive
объекту, чтобы упростить отправку и получение данных с помощью сериализации MFC.
Чтобы сериализовать (отправить) данные, вставьте его в архив, который вызывает CSocketFile
функции-члены для записи данных в CSocket
объект. Для десериализации (получения) данных извлекается из архива. Это приводит к тому, что архив вызывает CSocketFile
функции-члены для чтения данных из CSocket
объекта.
Совет
Помимо использования CSocketFile
, как описано здесь, его можно использовать как автономный файловый объект, как можно с CFile
его базовым классом. Можно также использовать CSocketFile
с любыми функциями сериализации MFC на основе архива. Так как CSocketFile
не поддерживает все CFile
функции, некоторые функции сериализации MFC по умолчанию несовместимы с CSocketFile
. Это особенно верно для CEditView
класса. Вместо этого не следует пытаться сериализовать CEditView
данные с помощью объекта, присоединенного CArchive
к объектуCSocketFile
, используйте CEditView::SerializeRaw
CEditView::Serialize
вместо этого. Функция SerializeRaw
ожидает, что объект файла имеет такие функции, как, например Seek
, CSocketFile
не имеет.
При использовании CArchive
и CSocketFile
CSocket
может возникнуть ситуация, когда 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.
Иерархия наследования
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