带存档的套接字示例

上传人:wm****3 文档编号:45971142 上传时间:2018-06-20 格式:DOCX 页数:6 大小:20.73KB
返回 下载 相关 举报
带存档的套接字示例_第1页
第1页 / 共6页
带存档的套接字示例_第2页
第2页 / 共6页
带存档的套接字示例_第3页
第3页 / 共6页
带存档的套接字示例_第4页
第4页 / 共6页
带存档的套接字示例_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《带存档的套接字示例》由会员分享,可在线阅读,更多相关《带存档的套接字示例(6页珍藏版)》请在金锄头文库上搜索。

1、Windows Sockets:带存档的套接字示例:带存档的套接字示例本文给出一个使用 CSocket 类的示例。该示例使用 CArchive 对象通过套接字来序列化数据。注意,这并不是来自某个文件或到某个文件的文档序列化。 下面的示例阐释了使用存档通过 CSocket 对象发送和接收数据的方式。该示例设计为应用程序的两个实例(在同一台计算机上或在网络上的不同计算机上)交换数据。一个实例发送数据,另一个实例接收并确认数据。每个应用程序都可以启动交换,也可作为另一个应用程序的服务器或客户端。下面的函数在应用程序的视图类中定义: void CBlabberView:PacketSerialize(

2、long nPackets, CArchive for(int p = 0; p strText; / display it DisplayMessage(strText); else CString strText; BYTE bCheck; WORD nCopies; for(int p = 0; p bCheck nCopies; for(int c = 0; c bValue; if (nCheck != bValue) AfxMessageBox(“Packet Failure“); / Receive receipt string and display it arData str

3、Text; DisplayMessage(strText); Text.Format(“Sent Packet %d of %d (Value=%d,Copies=%d)“,p,nPackets,(int)bValue,nCopies); / Send acknowledgment arAck ) 从存档中获取数据。接收应用程序验证收到的数据,显示最终的“已收到”(Received) 消息,然后发回一条消息,指明“已发送”(Sent) 以供发送应用程序显示。 在此通信模型中,“已收到”(Received) 一词( strText 变量中发送的消息)用于在通信的另一端显示,是向接收用户指明已经接

4、收到一定数量的数据包。接收端用一个指明“已发送”(Sent) 的相似字符串答复,而此字符串将在原始发送端的屏幕上显示。这两个字符串的回执说明通信已成功。警告警告 如果正编写与已建立的(非 MFC)服务器进行通信的 MFC 客户程序,则不要通过存档发送 C+ 对象。除非该服务器是一个 MFC 应用程序,它知道您要发送的对象的类型,否则服务器将无法接收和反序列化该对象。 Windows Sockets:带存档的套接字的工作方式:带存档的套接字的工作方式本文解释如何组合 CSocket 对象、CSocketFile 对象和 CArchive 对象以简化通过 Windows 套接字发送和接收数据。 文

5、章介绍了 PacketSerialize 函数。 PacketSerialize 示例中的存档对象的工作机制与传递给 MFC Serialize 函数的存档对象非常相似。它们之间的基本差异是:对于套接字,存档并不附加到标准的 CFile 对象(通常与磁盘文件关联),而是附加到 CSocketFile 对象。 CSocketFile 对象不是连接到磁盘文件,而是连接到 CSocket 对象。 一个 CArchive 对象管理一个缓冲区。当存储(发送)存档的缓冲区已满时,关联的 CFile 对象写出缓冲区的内容。刷新附加到套接字的存档缓冲区相当于发送消息。当加载(接收)存档的缓冲区已满时, CFi

6、le 对象停止读取直到该缓冲区再次可用。 CSocketFile 类从 CFile 派生,但它并不支持 CFile 成员函数,如定位函数 Seek 、 GetLength 、 SetLength 等,锁定函数 LockRange 和 UnlockRange ,或 GetPosition 函数。每个 CSocketFile 对象必须要做的事是,将字节序列写入或读入关联的 CSocket 对象,或从此对象写出或读出字节序列。因为不涉及文件, Seek 和 GetPosition 等操作没有意义。 CSocketFile 从 CFile 派生,因此它通常会继承所有这些成员函数。为防止发生这种情况,在

7、 CSocketFile 中重写不受支持的 CFile 成员函数以引发 CNotSupportedException。 CSocketFile 对象调用其 CSocket 对象的成员函数来发送或接收数据。 下图显示了在通信的两端这些对象之间的关系。 CArchive、CSocketFile 和和 CSocket 这看起来很复杂,其目的是使您不必亲自管理套接字的细节。您创建套接字、文件和存档,然后通过将数据插入存档或从存档提取数据,开始发送或接收数据。CArchive、CSocketFile 和 CSocket 管理后台的细节。 CSocket 对象实际是一个两状态对象:有时异步(通常状态)有时

8、同步。处于异步状态时,套接字可以从框架接收异步通知。然而,在操作(如接收或发送数据)过程中,套接字变为同步的。这意味着在同步操作完成之前,套接字不会接收进一步的异步通知。由于套接字切换模式,请执行类似下面的操作:CMySocket:OnReceive( ) / . ar str; / . 如果 CSocket 没有实现为两状态对象,则在您处理前面通知的同时,有可能接收到同类事件的附加通知。例如,在处理 OnReceive 时,可能收到 OnReceive 通知。在上面的代码片段中,从存档提取 str 可能导致递归。通过切换状态, CSocket 用防止附加通知的方法防止递归。一般规则是通知内没

9、有通知。 注意注意 CSocketFile 也可以作为一个没有 CArchive 对象的(有限)文件使用。默认情况下, CSocketFile 构造函数的 bArchiveCompatible 参数为 TRUE 。这指定文件对象用于存档。若要使用没有存档的文件对象,请在 bArchiveCompatible 参数中传递 FALSE 。 在“存档兼容”模式下, CSocketFile 对象可提供更好的性能并能减少“死锁”的危险。当发送套接字和接收套接字都在等待对方或等待公共资源时,就会发生死锁现象。如果 CArchive 对象用处理 CFile 对象的方式处理 CSocketFile ,也可能发生这种情况。处理 CFile 时,存档可假定只要它接收到的字节数比所请求的少,则说明已到达文件尾。而处理 CSocketFile 时,数据是基于消息的,缓冲区可包含多条消息,因此,接收的字节数比请求的字节数少并不能说明已到达文件尾。应用程序在此情况下并不阻塞(而使用 CFile 时可能阻塞),它可继续从缓冲区读取消息直到缓冲区变空。在这种情况下, CArchive 中的 IsBufferEmpty 函数有助于监视存档缓冲区的状态。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号