Windows套接字系列五:使用存档的套接字示例

本文介绍了一个使用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归档对象设置存储(发送),如果分支执行,否则,,如果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:背景

原文链接地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值