下面的例子说明如何使用存档的CSocket对象的数据发送和接收通过。这个例子的设计,使应用程序的两个实例(同一台机器上或网络上的不同机器)交换数据。一个实例发送数据时,其他实例接受和承认。无论是应用程序可以启动一个交流,或者可以作为服务器或作为其他应用程序的客户端。下面的函数定义在应用程序的视图类:
void CBlabberView::PacketSerialize(long nPackets, CArchive& arData,
CArchive& arAck)
{
if (arData.IsStoring())
{
CString strText;
for(int p = 0; p < nPackets; p++)
{
BYTE bValue = (BYTE)(rand()%256);
WORD nCopies = (WORD)(rand()%32000);
// Send header information
arData << bValue << nCopies;
for(int c = 0; c < nCopies; c++)
{
// Send data
arData << bValue;
}
Text.Format("Received Packet %d of %d
(Value=%d,Copies=%d)",p,nPackets,(int)bValue,nCopies);
// Send receipt string
arData << strText;
arData.Flush();
// Receive acknowledgment
arAck >> strText;
// display it
DisplayMessage(strText);
}
}
else
{
CString strText;
BYTE bCheck;
WORD nCopies;
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 (nCheck != bValue)
AfxMessageBox("Packet Failure");
}
}
// Receive receipt string and display it
arData >> strText;
DisplayMessage(strText);
Text.Format("Sent Packet %d of %d
(Value=%d,Copies=%d)",p,nPackets,(int)bValue,nCopies);
// Send acknowledgment
arAck << strText;
arAck.Flush();
}
}
在这个例子中,最重要的是,它的结构平行的MFC的Serialize函数。PacketSerialize成员函数包括一个else子句的if语句。该函数接收两个参数CArchive的引用:arData和arAck。如果的arData归档对象设置存储(发送),如果分支执行,否则,,如果arData装载(接收)函数else分支。如需在MFC中关于序列化的信息,请参阅序列化。
注意
arAck归档对象是假设到对面arData。如果arData发送,arAck接收,反过来是真实的。
发送,例如函数遍历一个指定的次数,每次产生一些随机的数据用于演示目的。您的应用程序将获得真实的数据,从一些源文件,如。用于发送三个连续的数据块流arData归档文件的插入符(<<):
一个“头”,指定的数据(在这种情况下,的bValue变量的值多少份,将发送)的性质。
这个例子中,这两个项目都是随机生成。
指定数量的数据副本。
内循环发送bValue指定的次数。
名为strText,再将一个字符串,接收,显示它的用户。
接收函数的工作方式类似,但它使用归档的提取操作符(>>)从归档数据。接收应用程序验证它接收到的数据,显示最后的“收到”消息,然后发送回一个消息,说“发送”,发送应用程序显示。
在这个通信模型中,“收到”,在变量strText,再将发来的消息,显示在另一端的通信,所以它指定的接收用户,已经收到了若干的数据包。接收机回答说原始发件人的屏幕上显示“发送”,类似的字符串。两个字符串的收据表明,成功的沟通发生。
警告
如果你正在写一个MFC客户端程序的沟通,建立(非MFC)服务器,不发送C + +对象,通过归档。除非服务器是MFC应用程序,了解你要发送的对象,将无法接收和反序列化对象。在文章的Windows Sockets:字节序的例子显示了这种类型的通信。
有关详细信息,请参见Windows Sockets规范:htonl,htons,ntohl,ntohs。此外,为了解更多信息,请参阅:
Windows Sockets:从套接字类派生
Windows Sockets:带存档的套接字工作原理
Windows Sockets:背景