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.
Este artigo apresenta um exemplo de uso da classe CSocket. O exemplo emprega CArchive objetos para serializar dados por meio de um soquete. Observe que isso não é serialização de documento de ou para um arquivo.
O exemplo a seguir ilustra como você usa o arquivo para enviar e receber dados através de objetos CSocket. O exemplo foi projetado para que duas instâncias do aplicativo (no mesmo computador ou em computadores diferentes na rede) troquem dados. Uma instância envia dados, que a outra instância recebe e reconhece. Qualquer aplicativo pode iniciar uma troca e pode atuar como servidor ou como cliente para o outro aplicativo. A seguinte função é definida na classe de exibição do aplicativo:
void PacketSerialize(long nPackets, CArchive &arData, CArchive &arAck)
{
BYTE bValue = 0;
WORD nCopies = 0;
if (arData.IsStoring())
{
CString strText;
errno_t err;
unsigned int number;
for (int p = 0; p < nPackets; p++)
{
err = rand_s(&number);
// if (err == 0)...
bValue = (BYTE)(number % 256);
err = rand_s(&number);
// if (err == 0)...
nCopies = (WORD)(number % 32000);
// Send header information
arData << bValue << nCopies;
for (int c = 0; c < nCopies; c++)
{
// Send data
arData << bValue;
}
strText.Format(_T("Sender sent packet %d of %d (Value = %d, Copies = %d)"),
p + 1, nPackets, (int)bValue, nCopies);
// Send receipt string
arData << strText;
arData.Flush();
// Receive acknowledgment
arAck >> strText;
// display it
DisplayMessage(strText);
}
}
else
{
CString strText;
BYTE bCheck;
for (int p = 0; p < nPackets; p++)
{
// Receive header information
arData >> bCheck >> nCopies;
for (int c = 0; c < nCopies; c++)
{
// Receive data
arData >> bValue;
if (bCheck != bValue)
{
AfxMessageBox(_T("Packet Failure"));
}
}
// Receive receipt string and display it
arData >> strText;
DisplayMessage(strText);
strText.Format(_T("Recipient received packet %d of %d (Value = %d, Copies = %d)"),
p + 1, nPackets, (int)bValue, nCopies);
// Send acknowledgment
arAck << strText;
arAck.Flush();
}
}
}
O mais importante neste exemplo é que sua estrutura é paralela à de uma função MFC Serialize . A função membro PacketSerialize consiste em uma instrução if com uma cláusula else. A função recebe duas referências CArchive como parâmetros: arData e arAck. Se o objeto arData archive estiver definido para armazenar (envio), o if branch será executado; caso contrário, se arData estiver definido para carregar (recebimento), a função usará o else branch. Para obter mais informações sobre serialização no MFC, consulte Serialização.
Observação
Supõe-se que o objeto arAck archive seja o oposto de arData. Se arData for para envio de dados, arAck recebe, e o contrário também é verdadeiro.
Para o envio, a função de exemplo passa por um loop por um número especificado de vezes, cada vez gerando alguns dados aleatórios com propósitos de demonstração. Seu aplicativo obteria dados reais de alguma fonte, como um arquivo. O operador de inserção do arquivo arData (<<) é usado para enviar um fluxo de três partes consecutivas de dados:
Um "cabeçalho" que especifica a natureza dos dados (nesse caso, o valor da variável bValue e quantas cópias serão enviadas).
Ambos os itens são gerados aleatoriamente para este exemplo.
O número especificado de cópias dos dados.
O loop interno
forenvia bValue o número de vezes especificado.Uma cadeia de caracteres chamada strText que o receptor exibe ao usuário.
Para receber, a função opera de forma semelhante, exceto por usar o operador de extração do arquivo (>>) para obter dados do arquivo. O aplicativo receptor verifica os dados recebidos, exibe a mensagem final "Recebido" e envia uma mensagem que diz "Enviado" para exibição do aplicativo de envio.
Neste modelo de comunicação, a palavra "Recebido", a mensagem enviada na variável strText , é exibida na outra extremidade da comunicação, portanto, especifica ao usuário receptor que um determinado número de pacotes de dados foram recebidos. O receptor responde com uma cadeia de caracteres semelhante que diz "Enviado", para exibição na tela do remetente original. O recebimento de ambas as cadeias de caracteres indica que a comunicação bem-sucedida ocorreu.
Cuidado
Se você estiver escrevendo um programa cliente MFC para se comunicar com servidores já estabelecidos (não MFC), não envie objetos C++ por meio do arquivo. A menos que o servidor seja um aplicativo MFC que entenda os tipos de objetos que você deseja enviar, ele não poderá receber e desserializar seus objetos. Um exemplo no artigo Windows Sockets: Byte Ordering mostra uma comunicação desse tipo.
Para obter mais informações, consulte Especificação do Windows Sockets: htonl, htons, ntohl, ntohs. Além disso, para obter mais informações, consulte:
Consulte também
Soquetes do Windows no MFC
CArchive::IsStoring
Operador CArchive:: <<
Operador CArchive:: >>
CArchive::Flush
CObject::Serialize