Класс CSocketFile
Объект CFile, используемый для отправки и приема данных через сеть по Windows sockets.
class CSocketFile : public CFile
Члены
Открытые конструкторы
Имя |
Описание |
---|---|
Создает объект CSocketFile. |
Заметки
Можно вложить объект CSocketFile к объекту CSocket для этой цели. Также можно и обычно сделать, вложен объект CSocketFile к объекту CArchive для упрощения отправка и получение данных с помощью сериализации MFC.
Для сериализации (текст) данные, вставьте ее в файл, который вызывает функции-члены CSocketFile для записи данных в объект CSocket. Для десериализации данных (get) можно извлекаете из архива. Это приводит к тому, что архив вызвать функции-члены 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 sockets допускают только один вызов recv в уведомление FD_READ, но CSocketFile и CSocket допускают несколько вызовов recv в FD_READ. Если получено FD_READ при отсутствии данных для чтения, приложение висит. Если вы не получаете другое FD_READ, то выполнение приложения остановится взаимодействия через гнездом.
Можно разрешить эту проблему следующим образом. В методе OnReceive класса сокета, вызов CAsyncSocket::IOCtl(FIONREAD, ...) до вызова метода Serialize класса сообщений, когда требуемые данные, считываемых из одного сокета превышает размер пакета TCP (MTU носитель сети, обычно не менее 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 sockets в MFC, Windows sockets: Использование сокета с архивами, а также API Windows sockets 2.
Иерархия наследования
CSocketFile
Требования
Header: afxsock.h