Windows套接字:套接字的示例使用中的存档

本文存在使用类的示例 CSocket。 该示例使用 CArchive 对象通过套接字序列化数据。 注意不是为了文档序列化来回文件。

下面的示例演示如何使用中的存档通过 CSocket 对象发送和接收数据。 示例设计,以便应用程序 (在同一台计算机或网络上不同的计算机) 交换数据的两个实例。 一个实例发送数据,另一个实例接收和识别。 任何应用程序可以启动替换,并且,要么可以作为服务器或客户端到其他应用程序。 以下功能在应用程序的视图类中定义:

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();
      }
    }
}

有关此示例的最重要的任务是 MFC Serialize 请函数的其结构并行。 PacketSerialize 成员函数包含 else 子句的一个 if 语句。 该函数接收两 CArchive 引用作为参数: arData 和 arAck。 如果 arData 存档对象用于存储 (发送) 设置, if 分支执行;否则,因此,如果 arData 用于加载 (接收) 设置函数采用 else 分支。 有关 MFC 中序列化的更多信息,请参见 序列化

备注

arAck 存档对象假定为 arData相反。如果 arData 用于发送, arAck 接收,并且,并为 true。

为发送,将示例函数 for 循环,每次生成一些随机数据的指定次数演示目的。 您的应用程序将从某一源的实际数据,如文件。 arData 存档的插入运算符 (<<) 用于发送数据这三个连续的区块流:

  • 指定数据的性质的 “标题” (在本例中,变量的 bValue 的值,并且多少个副本的发送)。

    两个项目用于此示例随机生成。

  • 数据的副本指定的数目。

    内部 for 循环发送 bValue 指定的次数。

  • 字符串调用接收方显示给其用户的 strText 。

用于接收,该功能类似运行,除此之外,使用从存档的存档的提取运算符 (>>) 获取数据。 它接收的接收方应用程序来验证数据,显示最终 “接收的”消息,然后回显示 “发送”为了发送的应用程序中显示的消息。

中的通信模型, “接收的”单词,在 strText 变量发送的信息,用于显示在窗体通信的另一端,因此,它指定给接收的用户许多的数据包接收。 接收方答复与指出 “发送”的相似字符串,原始发送方的屏幕显示的。 两个字符串的收货指示成功的通信发生。

警告

如果正在编写一个 MFC 客户端程序与已建立的 (非 MFC) 服务器通信,不要将存档发送 C++ 对象。除非服务器是了解该对象的 MFC 应用程序要发送,无法接收和反序列化您的对象。一个示例对这篇文章 Windows 套接字:字节顺序 中显示此类型的通信。

有关更多信息,请参见 Windows 套接字规范: htonlhtonsntohlntohs。 此外,有关更多信息,请参见:

请参见

参考

CArchive::IsStoring

CArchive::operator <<

CArchive::operator >>

CArchive::Flush

CObject::Serialize

概念

在MFC的Windows套接字