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
变量的值和将发送的份数)。 此示例中两项都是随机生成。 bValue
。 strText
的字符串。 strText
变量中发送的消息)用于在通信的另一端显示,是向接收用户指明已经接收到一定数量的数据包。接收端用一个指明“已发送”(Sent) 的相似字符串答复,而此字符串将在原始发送端的屏幕上显示。这两个字符串的回执说明通信已成功。 警告 假如正编写与已建立的(非 MFC)服务器进行通信的 MFC 客户程序,则不要通过存档发送 C++ 对象。除非该服务器是一个 MFC 应用程序,它知道您要发送的对象的类型,否则服务器将无法接收和反序列化该对象。文章 Windows Sockets:字节排序中的示例显示了一个此类型的通信。更多内容请看Windows操作系统安全集 Windows操作系统安装 Windows频道专题,或
新闻热点
疑难解答