Partilhar via


Classe CSocketFile

Observação

A biblioteca Microsoft Foundation Classes (MFC) continua a ser suportada. No entanto, já não estamos a adicionar funcionalidades nem a atualizar a documentação.

Um CFile objeto usado para enviar e receber dados através de uma rede através do Windows Sockets.

Sintaxe

class CSocketFile : public CFile

Membros

Construtores Públicos

Nome Description
CSocketFicheiro::CSocketFile Constrói um CSocketFile objeto.

Observações

Pode prender o CSocketFile objeto a um CSocket objeto para esse propósito. Também pode, e normalmente faz, anexar o CSocketFile objeto a um CArchive objeto para simplificar o envio e receção de dados usando serialização MFC.

Para serializar (enviar) dados, insere-se no arquivo, que chama CSocketFile funções membros para escrever dados no CSocket objeto. Para desserializar (receber) dados, extrai-se do arquivo. Isto faz com que o arquivo chame CSocketFile funções membros para ler dados do CSocket objeto.

Sugestão

Além de usar CSocketFile como descrito aqui, pode usá-lo como um objeto de ficheiro independente, tal como pode fazer com CFile, a sua classe base. Também pode usar CSocketFile com quaisquer funções de serialização MFC baseadas em arquivo. Como CSocketFile não suporta toda a CFilefuncionalidade de ', algumas funções de serialização MFC por defeito não são compatíveis com CSocketFile. Isto é particularmente verdade para a CEditView turma. Não deve tentar serializar CEditView dados através de um CArchive objeto associado a um CSocketFile objeto usando CEditView::SerializeRaw; use CEditView::Serialize instead. A SerializeRaw função espera que o objeto de ficheiro tenha funções, como Seek, que CSocketFile não possuem.

Quando usa com e , pode deparar-se com uma situação em que CSocket::Receive entra num ciclo (por PumpMessages(FD_READ)) à espera do número pedido de bytes.CSocketCSocketFileCArchive Isto porque os sockets do Windows permitem apenas uma chamada de recv por notificação FD_READ, mas CSocketFile também CSocket permitem múltiplas chamadas de recv por FD_READ. Se recebes um FD_READ quando não há dados para ler, a aplicação bloqueia. Se nunca conseguir outro FD_READ, a aplicação deixa de comunicar pelo soquete.

Pode resolver este problema da seguinte forma. No OnReceive método da sua classe socket, chame CAsyncSocket::IOCtl(FIONREAD, ...) antes de chamar o Serialize método da sua classe de mensagem quando os dados esperados a serem lidos do socket excedem o tamanho de um pacote TCP (unidade máxima de transmissão do meio de rede, normalmente pelo menos 1096 bytes). Se o tamanho dos dados disponíveis for inferior ao necessário, espere que todos os dados sejam recebidos e só então inicie a operação de leitura.

No exemplo seguinte, m_dwExpected é o número aproximado de bytes que o utilizador espera receber. Assume-se que a declaras noutro local do teu 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 mais informações, consulte Windows Sockets no MFC, Windows Sockets: Using Sockets with Archives, bem como Windows Sockets 2 API.

Hierarquia de herança

CObject

CFile

CSocketFile

Requerimentos

Cabeçalho: afxsock.h

CSocketFicheiro::CSocketFile

Constrói um CSocketFile objeto.

explicit CSocketFile(
    CSocket* pSocket,
    BOOL bArchiveCompatible = TRUE);

Parâmetros

pSocket
O soquete para se ligar ao CSocketFile objeto.

bArchiveCompatível
Especifica se o objeto de ficheiro é para uso com um CArchive objeto. Passa FALSE apenas se quiseres usar o CSocketFile objeto de forma autónoma, como farias com um objeto autónomo CFile , com certas limitações. Este flag altera a forma como o CArchive objeto ligado CSocketFile ao objeto gere o seu buffer para leitura.

Observações

O destruidor do objeto dissocia-se do objeto soquete quando este sai do âmbito ou é eliminado.

Observação

A CSocketFile também pode ser usado como um ficheiro (limitado) sem um CArchive objeto. Por defeito, o CSocketFile parâmetro bArchiveCompatible do construtor é TRUE. Isto especifica que o objeto de ficheiro é para uso com um arquivo. Para usar o objeto de ficheiro sem um arquivo, passe FALSE no parâmetro bArchiveCompatible .

No seu modo "compatível com arquivo", um CSocketFile objeto oferece melhor desempenho e reduz o perigo de um "deadlock". Um deadlock ocorre quando ambos os sockets de emissão e receção estão à espera um do outro, ou de um recurso comum. Esta situação pode ocorrer se o CArchive objeto trabalhasse com o CSocketFile da mesma forma que trabalha com um CFile objeto. Com CFile, o arquivo pode assumir que, se receber menos bytes do que o solicitado, o fim do ficheiro foi alcançado.

Com CSocketFile, no entanto, os dados são baseados em mensagens; o buffer pode conter múltiplas mensagens, pelo que receber menos do que o número de bytes solicitados não implica o fim do ficheiro. A aplicação não bloqueia neste caso como faria com CFile, e pode continuar a ler mensagens do buffer até que este fique vazio. A função CArchive::IsBufferEmpty é útil para monitorizar o estado do buffer do arquivo nesse caso.

Para mais informações sobre o uso de CSocketFile, consulte os artigos Windows Sockets: Usar Sockets com Arquivos e Windows Sockets: Exemplo de Sockets a Usar Arquivos.

Consulte também

Classe CFile
Gráfico de Hierarquia
Classe CAsyncSocket
Aula CSocket