Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Observação
A biblioteca Microsoft Foundation Classes (MFC) continua sendo suportada. No entanto, não estamos mais adicionando recursos ou atualizando a documentação.
Este artigo explica como um objeto CSocket , um objeto CSocketFile e um objeto CArchive são combinados para simplificar o envio e o recebimento de dados por meio de um Soquete do Windows.
O artigo Soquetes do Windows: exemplo de soquetes usando arquivos apresenta a PacketSerialize função. O objeto de arquivo no exemplo PacketSerialize funciona de forma semelhante a um objeto de arquivo passado para uma função MFC Serializar. A diferença essencial é que, para soquetes, o arquivo é anexado não a um objeto CFile padrão (normalmente associado a um arquivo de disco), mas a um CSocketFile objeto. Em vez de se conectar a um arquivo de disco, o CSocketFile objeto se conecta a um CSocket objeto.
Um CArchive objeto gerencia um buffer. Quando o buffer de um arquivo de armazenamento (envio) estiver cheio, um objeto associado CFile gravará o conteúdo do buffer. Liberar o buffer de um arquivo anexado a um soquete é equivalente a enviar uma mensagem. Quando o buffer de um arquivo de carregamento (recebimento) estiver cheio, o objeto CFile parará de ler até que o buffer esteja disponível novamente.
A classe CSocketFile deriva de CFile, mas não dá suporte a funções de membro CFile , como as funções de posicionamento (Seek, GetLength, SetLengthe assim por diante), as funções de bloqueio (LockRange, UnlockRange) ou a GetPosition função. Tudo o que o objeto CSocketFile deve fazer é gravar ou ler sequências de bytes de ou para o objeto associado CSocket . Como um arquivo não está envolvido, operações como Seek e GetPosition não fazem sentido.
CSocketFile é derivado de CFile, portanto, normalmente herdaria todas essas funções de membro. Para evitar isso, as funções de membro CFile sem suporte são substituídas em CSocketFile para lançar um CNotSupportedException.
O objeto CSocketFile chama funções membro do seu objeto CSocket 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 é protegê-lo da necessidade de gerenciar os detalhes do soquete por conta própria. Crie o soquete, o arquivo e o arquivo morto e comece a enviar ou receber dados inserindo-os no arquivo morto ou extraindo-os do arquivo morto. CArchive, CSocketFile e CSocket gerenciam os detalhes nos bastidores.
Um CSocket objeto é, na verdade, um objeto de dois estados: às vezes assíncrono (o estado habitual) e, às vezes, síncrono. Em seu estado assíncrono, um soquete pode receber notificações assíncronas da estrutura. No entanto, durante uma operação como receber ou enviar dados, o soquete se torna síncrono. Isso significa que o soquete não receberá mais notificações assíncronas até que a operação síncrona seja concluída. Como ele alterna os modos, você pode, por exemplo, fazer algo semelhante ao 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 tiver sido implementado como um objeto de dois estados, talvez seja possível receber notificações adicionais para o mesmo tipo de evento enquanto você estava processando uma notificação anterior. Por exemplo, você pode receber uma OnReceive notificação durante o processamento de um OnReceive. No fragmento de código acima, a extração str do arquivo pode levar à recursão. Ao alternar estados, CSocket impede a recursão impedindo notificações adicionais. A regra geral é não haver notificações dentro de notificações.
Observação
Um CSocketFile também pode ser usado como um arquivo (limitado) sem um CArchive objeto. Por padrão, o CSocketFile parâmetro bArchiveCompatible do construtor é TRUE. Isso especifica que o objeto de arquivo é usado com um arquivo morto. Para usar o objeto de arquivo sem arquivamento, passe FALSE no parâmetro bArchiveCompatible.
Em seu modo "compatível com arquivos", um objeto CSocketFile oferece melhor desempenho e reduz o perigo de um "impasse". Um impasse ocorre quando os soquetes de envio e recebimento estão aguardando um ao outro ou aguardando um recurso comum. Essa situação poderá ocorrer se o objeto CArchive funcionou com o CSocketFile da maneira como funciona com um objeto CFile. Com CFile, o arquivo pode assumir que, se receber menos bytes do que o solicitado, o fim do arquivo será atingido. Com CSocketFile, no entanto, os dados são baseados em mensagem; o buffer pode conter várias mensagens, portanto, receber menos do que o número de bytes solicitados não implica o fim do arquivo. O aplicativo não é bloqueado nesse caso, como pode ser com CFile, e pode continuar lendo mensagens do buffer até que o buffer esteja vazio. A função CArchive é útil para monitorar o estado do buffer do arquivo em tal caso.
Para obter mais informações, consulte Os Soquetes do Windows: Usando soquetes com arquivos