Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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
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