设为首页 加入收藏

TOP

Windows Sockets:带存档的套接字的工作方式
2014-11-23 21:33:54 来源: 作者: 【 】 浏览:9
Tags:Windows Sockets 存档 套接字 工作 方式

本文解释如何组合 CSocket 对象、CSocketFile 对象和 CArchive 对象以简化通过 Windows 套接字发送和接收数据。

文章 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 用防止附加通知的方法防止递归。一般规则是通知内没有通知。

CHATTERCHATSRVR 示例应用程序阐释了这种用法。有关 MFC 示例的源代码和信息,请参见 MFC 示例

注意 CSocketFile 也可以作为一个没有 CArchive 对象的(有限)文件使用。默认情况下, CSocketFile 构造函数的 bArchiveCompatible 参数为 TRUE 。这指定文件对象用于存档。若要使用没有存档的文件对象,请在 bArchiveCompatible 参数中传递 FALSE

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

有关更多信息,请参见 Windows Sockets:使用带存档的套接字

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇纯C语言写的:迷宫游戏 下一篇Windows Sockets:带存档的套接字..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: