Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Примечание.
Библиотека классов Microsoft Foundation (MFC) продолжает поддерживаться. Однако мы больше не добавляем функции или обновляем документацию.
Объект 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.
Иерархия наследования
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