Partilhar via


Classe CSocketFile

A CFile objeto usado para enviar e receber dados em uma rede por meio do Windows Sockets.

class CSocketFile : public CFile

Comentários

Você pode anexar o CSocketFile objeto para um CSocket objeto para essa finalidade. Você também pode e geralmente fazer, anexe o CSocketFile objeto para um CArchive objeto para simplificar enviando e recebendo dados de uso da serialização do MFC.

Para serializar dados (Enviar), inseri-lo para o arquivar, que chama CSocketFile funções de membro para gravar dados para o CSocket objeto. Para desserializar (recebimento) dados, extrair do arquivar.Isso faz com que o arquivar telefonar CSocketFile funções de membro para ler os dados dos CSocket objeto.

Dica:

Além de usar CSocketFile conforme descrito aqui, você pode usá-lo sistema autônomo um objeto de arquivo autônomos, exatamente sistema autônomo você pode fazer com CFile, sua classe base. Você também pode usar CSocketFile com as funções de serialização qualquer MFC com base em arquivar. Porque CSocketFile não oferece suporte a todos CFileda funcionalidade, alguns padrão MFC serializar funções não são compatível com o CSocketFile. Isso é especialmente verdadeiro do CEditView classe. Você não deve tentar serializar CEditView dados por meio de um CArchive objeto anexado a um CSocketFile uso de objeto CEditView::SerializeRaw; use CEditView::Serialize em vez disso.The SerializeRaw função espera o objeto de arquivo têm funções, sistema autônomo Seek, que CSocketFile não é necessário.

Quando você usa CArchive com CSocketFile e CSocket, você pode encontrar uma situação em que CSocket::Receive entra em um loop (por PumpMessages(FD_READ)) Aguardando a quantidade de bytes solicitada.Isso ocorre porque o Windows sockets permitem apenas uma telefonar recv por notificação FD_READ mas CSocketFile e CSocket permitir que várias chamadas recv por FD_READ. Se você obtiver um FD_READ quando não houver nenhum dado a ser lido, o aplicativo trava.Se outro FD_READ nunca, o aplicativo pára se comunicam através do soquete.

Você pode resolver esse problema da seguinte maneira.No OnReceive método de sua classe de soquete, telefonar CAsyncSocket::IOCtl (FIONREAD...) antes de chamar o Serialize método de sua classe de mensagens quando os dados esperados para ser lido do soquete excedem o dimensionar de um pacote TCP (unidade máxima de transmissão de meio de rede, geralmente pelo menos 1096 bytes). Se o dimensionar dos dados disponível é menor do que o necessário, aguarde até que todos os dados a ser recebido e, em seguida, somente iniciar a operação de leitura.

No exemplo a seguir, m_dwExpected é o número aproximado de bytes que o usuário espera receber. Supõe-se que você declare-lo em outro 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 Windows Sockets no MFC, Windows Sockets: Usando soquetes com arquivos, bem sistema autônomo API do Windows Sockets 2.

Requisitos

Cabeçalho: afxsock.h

Consulte também

Referência

Classe CFile

Gráfico de hierarquia

Classe CAsyncSocket

Classe CSocket

Outros recursos

CSocketFile membros