Classe CSocketFile
Um objeto de CFile usado enviando e recebendo dados através de uma rede através da do windows.
class CSocketFile : public CFile
Membros
Construtores public
Nome |
Descrição |
---|---|
Constrói um objeto de CSocketFile . |
Comentários
Você pode anexar o objeto de CSocketFile a um objeto de CSocket essa finalidade. Você também pode, e faz em geral, para anexar o objeto de CSocketFile a um objeto de CArchive para simplificar enviar e receber dados usando serialização MFC.
Para serializar dados (enviar), você inserção no arquivo, que chama funções de membro de CSocketFile para gravar dados para o objeto de CSocket. Para desserializar (para receber) dados, você extrai do arquivamento. Isso faz com que o arquivo neutro chama funções de membro de CSocketFile para ler dados de objeto de CSocket .
Dica
Além de usar CSocketFile conforme descrito aqui, você pode usá-lo como um objeto autônomo de arquivo, assim como faria com CFile, sua classe base.Você também pode usar CSocketFile com todas as funções arquivo com base morto- de serialização MFC.Porque CSocketFile não suporta qualquer funcionalidade de CFile, qualquer opção MFC serializa funções não é compatível com CSocketFile.Isso é especialmente verdadeiro da classe de CEditView .Você não deve tentar serializar os dados de CEditView através de um objeto de CArchive anexado a um objeto de CSocketFile usando CEditView::SerializeRaw; use CEditView::Serialize em vez de isso.A função de SerializeRaw espera o objeto do arquivo ter funções, como Seek, que não tem CSocketFile .
Quando você usa CArchive com CSocketFile e CSocket, você pode encontrar uma situação onde CSocket::Receive incorpora um loop (por PumpMessages(FD_READ)) que espera a quantidade solicitada de bytes. Isso ocorre porque os soquetes do windows permitem apenas uma chamada de recv por notificação de FD_READ, mas CSocketFile e CSocket permitem várias chamadas de recv por FD_READ. Se você obtém um FD_READ quando não há nenhum dados para ler, o aplicativo pendura. Se você nunca é outro FD_READ, o aplicativo pára de se comunicar sobre o soquete.
Você pode resolver esse problema como segue. Em o método de OnReceive de sua classe de soquete, chamada CAsyncSocket::IOCtl(FIONREAD, ...) antes de chamar o método de Serialize da classe de mensagem quando os dados esperados a ser lidos de soquete excederem o tamanho de um pacote TCP (Maximum Transmission Unit do meio de rede, geralmente pelo menos de 1096 bytes). Se o tamanho dos dados disponíveis é menos que necessário, espere todos os dados a ser recebidos e apenas iniciar a operação de leitura.
Em o exemplo, m_dwExpected é o número de bytes próximo que o usuário receber espera. Assume-se que você o declara em qualquer lugar no seu código.
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
}
}
Para obter mais informações, consulte Soquetes do windows no MFC, Soquetes do windows: usando os soquetes com arquivos mortos, bem como 2 A API do windows.
Hierarquia de herança
CSocketFile
Requisitos
Cabeçalho: afxsock.h