Windows Sockets: Como funcionam os soquetes com arquivos
Este artigo explica como um CSocket object, a CSocketFile objeto e um CArchive objeto são combinados para simplificar a enviar e receber dados por meio de um soquete do Windows.
O artigo Windows Sockets: Exemplo de soquetes de segurança usando arquivos apresenta o PacketSerialize função.O objeto de arquivar no PacketSerialize exemplo funciona como um objeto de arquivar passado para um MFC Serializar função.A diferença fundamental é que para soquetes, o arquivar está conectado não a um padrão Carquivar objeto (geralmente associados a um disco arquivar), mas um CSocketFile objeto. Em vez de se conectar a um arquivo de disco, a CSocketFile objeto se conecta a um CSocket objeto.
A CArchive objeto gerencia um buffer. Quando o buffer de um arquivar armazenando (envio) está cheio, um associado CFile objeto gravará o Sumário do buffer. Esvaziando o buffer de um sistema de arquivar conectado a um soquete é equivalente ao enviar uma mensagem.Quando o buffer de um arquivar de carregamento (recebimento) está cheio, o CFile objeto interrompe a leitura até que o buffer esteja disponível novamente.
De classeCSocketFile deriva da CFile, mas não oferece suporte CFile funções de membro, sistema autônomo sistema autônomo funções de posicionamento (Seek, GetLength, SetLengthe assim por diante), o bloqueio funciona ()LockRange, UnlockRange), ou o GetPosition função. Todos os CSocketFile objeto precisa fazer é escrever ou ler as seqüências de bytes ou para o associado CSocket objeto. Porque um arquivo não está envolvido, operações, sistema autônomo Seek e GetPosition não fazem sentido. CSocketFile é derivado de CFile, portanto, normalmente herdaria todas essas funções de membro. Para evitar isso, a sem suporteCFile funções de membro são substituídas em CSocketFile Lançar um CNotSupportedException.
The CSocketFile objeto chama membro funções de seu CSocket objeto para enviar ou receber dados.
A figura a seguir mostra as relações entre esses objetos em ambos os lados da comunicação.
CArchive CSocketFile e CSocket
A finalidade dessa complexidade aparente é proteger você da necessidade de gerenciar os detalhes de soquete você mesmo.Você criar o soquete, o arquivar e o arquivar e comece envio ou recebimento de dados por inseri-lo para o arquivar ou extraindo-o do arquivar.CArchive, CSocketFile, and CSocket gerencie os detalhes em segundo plano.
A CSocket o objeto é realmente um dois-objeto de estado: às vezes, um síncrono (o estado normal) e, às vezes, síncrono.Em seu estado assíncrono, um soquete pode receber notificações assíncronas de estrutura.No entanto, durante uma operação sistema autônomo receber ou enviar dados soquete fica síncrono.Isso significa que o soquete receberá nenhuma notificações assíncrono até que a operação assíncrono seja concluída.Porque ele alterna modos, você pode, por exemplo, fazer algo como o seguinte:
void CMySocket::OnReceive(int nErrorCode)
{
if (0 == nErrorCode)
{
CSocketFile file(this);
CArchive ar(&file, CArchive::load);
CString str;
ar >> str;
}
}
If CSocket não foram implementados sistema autônomo um objeto de dois estados, talvez seja possível receber notificações de adicionais para o mesmo tipo de evento enquanto estava processando uma notificação anterior. Por exemplo, você pode obter um OnReceive notificação ao processar um OnReceive. No fragmento de código acima, extraindo str do arquivar pode levar a recursão. Alternando estados, CSocket evita a recursão por impedindo notificações adicionais. A regra geral não é nenhum notificações de notificações.
Observação: |
---|
A CSocketFile também pode ser usado sistema autônomo um arquivo (limitado) sem um CArchive objeto. Por padrão, a CSocketFile do construtor bArchiveCompatible o parâmetro é TRUE.Isso especifica que o arquivar objeto é para uso com um sistema de arquivar.Para usar o arquivar objeto sem um sistema de arquivar, passar FALSE in the bArchiveCompatible parâmetro. |
No modo "compatível com o arquivar", umCSocketFileobjeto fornece melhor desempenho e reduz o perigo de "deadlock". Um deadlock ocorre quando os soquetes de envio e recebimento estão aguardando uns aos outros ou aguardando um recurso comum.Essa situação pode ocorrer se o CArchive objeto trabalhou com a CSocketFile a forma que faz com um CFile objeto. Com CFile, o arquivar pode assumir que, caso receba bytes menos do que ele solicitado, o participante do arquivar foi atingido. Com CSocketFile, no entanto, os dados são mensagem com base; o buffer pode conter várias mensagens, portanto, receber menos que o número de bytes solicitado não implica o participante do arquivo. O aplicativo não bloqueia nesse caso, sistema autônomo pode ocorrer com CFile, e ele poderá continuar a leitura de mensagens do buffer até que o buffer esteja vazio. The IsBufferEmpty função CArchive é útil para monitorar o estado de buffer do arquivar nesse caso.
Para obter mais informações, consulte Windows Sockets: Usando soquetes com arquivos