本文给出一个使用 CSocket 类的示例。该示例使用 CArchive 对象通过套接字来序列化数据。注重,这并不是来自某个文件或到某个文件的文档序列化。
下面的示例阐释了使用存档通过 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 存档对象设置为用于存储(发送),则执行 if 分支;否则,假如 arData 设置为用于加载(接收),函数将执行 else 分支。有关 MFC 中序列化的更多信息,请参见序列化。
注重 假定 arAck 存档对象的操作与 arData 刚好相反: arData 用于发送时, arAck 用于接收,反过来也一样。
对于发送,该示例函数按指定的次数循环,而每一次都生成一些随机数据用于演示目的。应用程序从某个源(如文件)中获取真实数据。 arData 存档的插入运算符 ( < < ) 用于发送由三个连续数据块组成的流:
指定数据性质的“头”(这里是指 bValue 变量的值和将发送的份数)。
此示例中两项都是随机生成。
指定的数据份数。
内部 for 循环按指定的次数发送 bValue 。
接收端显示给用户的称为 strText 的字符串。
在接收方面,函数的操作相似,不同的是它使用存档的提取运算符 ( >>) 从存档中获取数据。接收应用程序验证收到的数据,显示最终的“已收到”(Received) 消息,然后发回一条消息,指明“已发送”(Sent) 以供发送应用程序显示。
在此通信模型中,“已收到”(Received) 一词( strText 变量中发送的消息)用于在通信的另一端显示,是向接收用户指明已经接收到一定数量的数据包。接收端用一个指明“已发送”(Sent) 的相似字符串答复,而此字符串将在原始发送端的屏幕上显示。这两个字符串的回执说明通信已成功。
警告 假如正编写与已建立的(非 MFC)服务器进行通信的 MFC 客户程序,则不要通过存档发送 C++ 对象。除非该服务器是一个 MFC 应用程序,它知道您要发送的对象的类型,否则服务器将无法接收和反序列化该对象。文章 Windows Sockets:字节排序中的示例显示了一个此类型的通信。
更多内容请看Windows操作系统安全集 Windows操作系统安装 Windows频道专题,或