Compartilhar via


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

CSocketFile::CSocketFile

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

CObject

CFile

CSocketFile

Requisitos

Cabeçalho: afxsock.h

Consulte também

Referência

Classe CFile

Gráfico da hierarquia

Classe CAsyncSocket

Classe CSocket