Windows Sockets:带存档的套接字的工作方式

2016-02-19 18:35 5 1 收藏

下面是个Windows Sockets:带存档的套接字的工作方式教程,撑握了其技术要点,学起来就简单多了。赶紧跟着图老师小编一起来看看吧!

【 tulaoshi.com - 编程语言 】

本文解释如何组合 CSocket 对象、CSocketFile 对象和 CArchive 对象以简化通过 Windows 套接字发送和接收数据。 !-- frame contents -- !-- /frame contents -- 文章 Windows Sockets:带存档的套接字示例介绍了 PacketSerialize 函数。 PacketSerialize 示例中的存档对象的工作机制与传递给 MFC Serialize 函数的存档对象非常相似。它们之间的基本差异是:对于套接字,存档并不附加到标准的 CFile 对象(通常与磁盘文件关联),而是附加到 CSocketFile 对象。 CSocketFile 对象不是连接到磁盘文件,而是连接到 CSocket 对象。 一个 CArchive 对象治理一个缓冲区。当存储(发送)存档的缓冲区已满时,关联的 CFile 对象写出缓冲区的内容。刷新附加到套接字的存档缓冲区相当于发送消息。当加载(接收)存档的缓冲区已满时, CFile 对象停止读取直到该缓冲区再次可用。 CSocketFile 类从 CFile 派生,但它并不支持 CFile 成员函数,如定位函数 Seek 、 GetLength 、 SetLength 等,锁定函数 LockRange 和 UnlockRange ,或 GetPosition 函数。每个 CSocketFile 对象必须要做的事是,将字节序列写入或读入关联的 CSocket 对象,或从此对象写出或读出字节序列。因为不涉及文件, Seek 和 GetPosition 等操作没有意义。 CSocketFile 从 CFile 派生,因此它通常会继续所有这些成员函数。为防止发生这种情况,在 CSocketFile 中重写不受支持的 CFile 成员函数以引发 CNotSupportedException。 CSocketFile 对象调用其 CSocket 对象的成员函数来发送或接收数据。 下图显示了在通信的两端这些对象之间的关系。 CArchive、CSocketFile 和 CSocket
这看起来很复杂,其目的是使您不必亲自治理套接字的细节。您创建套接字、文件和存档,然后通过将数据插入存档或从存档提取数据,开始发送或接收数据。CArchive、CSocketFile 和 CSocket 治理后台的细节。 CSocket 对象实际是一个两状态对象:有时异步(通常状态)有时同步。处于异步状态时,套接字可以从框架接收异步通知。然而,在操作(如接收或发送数据)过程中,套接字变为同步的。这意味着在同步操作完成之前,套接字不会接收进一步的异步通知。由于套接字切换模式,请执行类似下面的操作: CMySocket::OnReceive( ){ // ... ar str; // ...} 假如 CSocket 没有实现为两状态对象,则在您处理前面通知的同时,有可能接收到同类事件的附加通知。例如,在处理 OnReceive 时,可能收到 OnReceive 通知。在上面的代码片段中,从存档提取 str 可能导致递归。通过切换状态, CSocket 用防止附加通知的方法防止递归。一般规则是通知内没有通知。 CHATTER 和 CHATSRVR 示例应用程序阐释了这种用法。有关 MFC 示例的源代码和信息,请参见 MFC 示例。
注重 CSocketFile 也可以作为一个没有 CArchive 对象的(有限)文件使用。默认情况下, CSocketFile 构造函数的 bArchiveCompatible 参数为 TRUE 。这指定文件对象用于存档。若要使用没有存档的文件对象,请在 bArchiveCompatible 参数中传递 FALSE 。
   在“存档兼容”模式下, CSocketFile 对象可提供更好的性能并能减少“死锁”的危险。当发送套接字和接收套接字都在等待对方或等待公共资源时,就会发生死锁现象。假如 CArchive 对象用处理 CFile 对象的方式处理 CSocketFile ,也可能发生这种情况。处理 CFile 时,存档可假定只要它接收到的字节数比所请求的少,则说明已到达文件尾。而处理 CSocketFile 时,数据是基于消息的,缓冲区可包含多条消息,因此,接收的字节数比请求的字节数少并不能说明已到达文件尾。应用程序在此情况下并不阻塞(而使用 CFile 时可能阻塞),它可继续从缓冲区读取消息直到缓冲区变空。在这种情况下, CArchive 中的 IsBufferEmpty 函数有助于监视存档缓冲区的状态。 有关更多信息,请参见 Windows Sockets:使用带存档的套接字。

来源:https://www.tulaoshi.com/n/20160219/1618260.html

延伸阅读
本文介绍 Windows Sockets 的性质和用途。其他内容还包括: 定义术语“套接字”。 描述 SOCKET 句柄数据类型。 描述套接字的用途。 !-- frame contents -- !-- /frame contents -- Windows Sockets 规范为 Microsoft Windows 定义了一个二进制兼容网络编程接口。Windows Sockets 基于 Berkeley Software Distribution(BSD,4.3 版...
标签: PHP
PHP套接字编程   作者:久隆信息/张晓刚 时间:2004-04-12 7:44:52 来自: 责任编辑:clinch           --------------------------------------------------------------------------------       套接字编程,一般使用c或c++。特别的在web应用程序开发中,常用perl实...
在前面的几个部分里面,我们已经学会了怎么样从网络上读写信息了.前面的一些函数(read,write)是网络程序里面最基本的函数.也是最原始的通信函数.在这一章里面,我们一起来学习网络通信的高级函数.这一章我们学习另外几个读写函数. 6.1 recv和send recv和send函数提供了和read和write差不多的功能.不过它们提供 了第四个参...
标签: 摄影
这篇文章主要介绍了了解偏振镜的类型和工作方式(摄影器材),需要的朋友可以参考下 相机上的偏振镜可能是最重要的滤光镜之一。偏振镜的作用是消除偏振光,减少反光和眩光,同时增加色彩饱和度——特别是对蓝天。圆形偏振镜的使用方法是旋转外层镜片,具体角度根据实际情况而定。偏振镜的效果很难通过电脑上的后期处理来实现。 ...
[文章信息]作者:petery时间:2003-07-29出处:论坛责任编辑:方舟[文章导读]在TCP/IP网络中两个进程间的相互作用的主机模式是客户机/服务器模式...... 一、客户机/服务器模式 !-- frame contents -- !-- /frame contents -- 在TCP/IP网络中两个进程间的相互作用的主机模式是客户机/服务器模式(Client/Server model)。该模式的建立基...