Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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 para ou de um arquivo.
O exemplo a seguir ilustra como você usa o arquivo para enviar e receber dados por meio de CSocket objetos. O exemplo foi projetado para que duas instâncias do aplicativo (na mesma máquina ou em máquinas 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();
}
}
}
A coisa mais importante sobre este exemplo é que sua estrutura é paralela à de uma função MFC Serialize . A PacketSerialize função de membro consiste em uma if declaração com uma else cláusula. A função recebe duas referências CArchive como parâmetros: arData e arAck. Se o objeto arData archive estiver definido para armazenar (enviar), a if ramificação será executada, caso contrário, se arData estiver definida para carregar (receber), a função assumirá a else ramificação. Para obter mais informações sobre serialização no MFC, consulte Serialização.
Observação
O objeto de arquivo arAck é assumido como o oposto de arData. Se arData é para enviar, arAck recebe, e o inverso é verdadeiro.
Para o envio, a função de exemplo faz loops por um número especificado de vezes, cada vez gerando alguns dados aleatórios para fins 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 blocos consecutivos de dados:
Um "cabeçalho" que especifica a natureza dos dados (neste 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 especificado de vezes.Uma cadeia de caracteres chamada strText que o recetor exibe para seu usuário.
Para receber, a função opera de forma semelhante, exceto que usa o operador de extração do arquivo (>>) para obter dados do arquivo. O aplicativo recetor verifica os dados que recebe, exibe a mensagem final "Recebido" e, em seguida, envia de volta uma mensagem que diz "Enviado" para o aplicativo de envio exibir.
Neste modelo de comunicações, a palavra "Received", a mensagem enviada na variável strText , é para exibição na outra extremidade da comunicação, por isso especifica ao usuário recetor que um determinado número de pacotes de dados foram recebidos. O recetor responde com uma string 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.
Atenção
Se você estiver escrevendo um programa cliente MFC para se comunicar com servidores estabelecidos (não-MFC), não envie objetos C++ através 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. Para mais informações, consulte:
Ver também
Windows Sockets no MFC
CArchive::IsStoring
CArchive::operador <<
CArchive::operador >>
CArchive::Flush
CObject::Serialize