Windows Sockets: Como funcionam Sockets com arquivos

Este artigo explica como um CSocket objeto, uma CSocketFile objeto e um CArchive objeto são combinados para simplificar o envio e recebimento de dados através de um soquete do Windows.

O artigo Windows Sockets: exemplo de Sockets usando arquivos apresenta o PacketSerialize função.O objeto de arquivamento de PacketSerialize exemplo funciona quase como um objeto de arquivo passado para um MFC Serialize função.A diferença fundamental é que para soquetes, o arquivamento está associado não a um padrão CFile objeto (geralmente associado a um arquivo de disco), mas para um CSocketFile objeto.Em vez de se conectar a um arquivo de disco, o CSocketFile objeto conecta a uma CSocket objeto.

A CArchive objeto gerencia um buffer.Quando o buffer de um arquivamento armazenando (envio) estiver cheio, um associado CFile objeto grava conteúdo do buffer.Flushing buffer de um arquivo anexado a um soquete é equivalente ao envio de uma mensagem.Quando o buffer de um arquivo de carregamento (recebimento) está cheio, o CFile objeto interrompe a leitura até que o buffer está disponível novamente.

Classe CSocketFile deriva de CFile, mas não suporta CFile funções de membro, como as funções de posicionamento (Seek, GetLength, SetLengthe assim por diante), o bloqueio de funções (LockRange, UnlockRange), ou o GetPosition função.Todos os CSocketFile objeto deve fazer é escrever ou ler as seqüências de bytes ou para o associado CSocket objeto.Porque um arquivo não está envolvido, operações, como Seek e GetPosition não faz sentido.CSocketFilederivado de CFile, portanto, ele normalmente herdaria todas essas funções de membro.Para evitar isso, o suporte para CFile funções de membro são substituídas em CSocketFile lançar um CNotSupportedException.

O CSocketFile objeto chama membro funções de sua CSocket o 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

CArchive CSocketFile CSocket

A finalidade dessa complexidade aparente é proteger você da necessidade de gerenciar os detalhes do soquete você mesmo.Criar o soquete, o arquivo e o arquivamento e começar enviando ou recebendo dados por inseri-lo para o arquivamento ou extraindo-o do arquivamento.CArchive, CSocketFile, e CSocket gerenciar detalhes nos bastidores.

A CSocket é realmente um objeto de dois estados: às vezes assíncrona (estado normal) e às vezes síncrona.Em seu estado assíncrono, um soquete pode receber notificações assíncronas do framework.No entanto, durante uma operação, como recebimento ou envio de dados, o soquete fica síncrono.Isso significa que o soquete receberá nenhuma notificações assíncronas até que a operação síncrona foi concluída.Como alternar os 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;
   }
}

Se CSocket não foram implementados como um objeto de dois estados, talvez seja possível receber notificações 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 uma OnReceive.No fragmento de código acima, extraindo str do arquivamento pode levar a recursão.Alternando estados, CSocket evita recursão impedindo notificações adicionais.A regra geral é não notificações em notificações.

ObservaçãoObservação

A CSocketFile também pode ser usado como um arquivo (limitado) sem um CArchive objeto.Por padrão, o CSocketFile do construtor bArchiveCompatible parâmetro é TRUE.Especifica que o objeto de arquivo é para uso com um arquivo.Para usar o objeto de arquivo sem um arquivo morto, passe FALSE na bArchiveCompatible parâmetro.

Em seu modo de "arquivamento compatível", um CSocketFile objeto fornece melhor desempenho e reduz o perigo de "bloqueio". Um deadlock ocorre quando os soquetes envio e recebimento estão aguardando outro ou aguardando um recurso comum.Esta situação pode ocorrer se o CArchive objeto trabalhou com a CSocketFile a maneira como faz com uma CFile objeto.Com CFile, o arquivamento pode assumir que se recebe menos bytes solicitados por ele, a fim de arquivo foi atingido.Com CSocketFile, no entanto, os dados serão mensagem baseada; o buffer pode conter várias mensagens para que receber menos que o número de bytes solicitado não implica o fim do arquivo.O aplicativo não bloquear nesse caso, como pode ocorrer com CFile, e continuar a leitura de mensagens do buffer até que o buffer esteja vazio.O IsBufferEmpty função em CArchive é útil para monitorar o estado do buffer do arquivo nesse caso.

Para obter mais informações, consulte Windows Sockets: usando Sockets com arquivos

Consulte também

Referência

CObject::Serialize

Conceitos

Windows Sockets no MFC