Windows套接字:套接字具有如何的存档工作

本文说明 CSocket 对象、 CSocketFile 对象和对象 CArchive 如何合并简化发送和接收数据通过窗口存储。

这篇文章 Windows 套接字:套接字的示例使用中的存档 存在 PacketSerialize 功能。在 PacketSerialize 示例中的存档对象工作原理非常类似于存档对象传递到 MFC 序列化 功能。这个重要区别是套接字的,存档附加而非标准 C 文件 对象 (通常与磁盘文件),但对 CSocketFile 对象。而不是连接到磁盘文件, CSocketFile 对象连接到 CSocket 对象。

CArchive 对象管理缓冲区。当单元 (发送) 的缓冲区存档已满,一个关联的 CFile 对象写出缓冲区的内容。刷新存档的缓冲区附加到套接字与发送消息是等效的。当加载 (接收) 的缓冲区存档已满, CFile 对象停止读取,直到缓冲区再次可用。

CSocketFileCFile派生,但是,它不支持 C 文件 成员函数 (如定位功能 (SeekGetLengthSetLength,等等),死锁功能 (LockRangeUnlockRange),或者 GetPosition 功能。所有 CSocketFile 对象必须执行是写入或读取的字节数序列化为从关联的 CSocket 对象。该文件不是包含的操作,例如 SeekGetPosition 没有意义。CSocketFileCFile派生,因此,它通常将继承所有这些成员函数。若要防止出现这种情况,不支持的 CFile 成员函数在 CSocketFile 重写引发 CNotSupportedException

CSocketFile 对象调用其 CSocket 对象的成员函数发送或接收数据。

下图显示了这些对象之间的关系在窗体的通信双方。

CArchive、CSocketFile 和 CSocket

CArchive CSocketFile CSocket

此清单的复杂的目的是防止您管理套接字的详细信息必要性。您创建套接字、文件和存档,然后启动发送或接收数据通过插入到存档或提取它从存档。CArchiveCSocketFileCSocket 在后台管理详细信息。

CSocket 对象实际上是两个状态对象:有时异步 (通常状态) 和有时同步。在其异步状态,套接字可以接收从该结构的异步通知。但是,在操作期间例如接收或发送数据套接字已同步。这意味着套接字将接收没有进一步异步通知,直到这次同步操作完成。由于它切换模式,您可能,例如,执行与下面类似的内容:

void CMySocket::OnReceive(int nErrorCode)
{
   if (0 == nErrorCode)
   {
      CSocketFile file(this);
      CArchive ar(&file, CArchive::load);
      CString str;

      ar >> str;
   }
}

如果 CSocket 尚未实现为两个状态对象,接收到相同的其他通知事件可能的,在处理前一个通知时。例如,您可能会收到 OnReceive 请注意,当处理 OnReceive时。在以上代码片段,提取 str 从存档可能导致递归。通过切换状态, CSocket 通过阻止其他通知防止递归。该一般规则是在通知中不通知。

说明说明

CSocketFile 也可用作 (有限) 文件,而不 CArchive 对象。默认情况下, CSocketFile 构造函数的 bArchiveCompatible 参数是 TRUE。这指定文件对象功能上与存档。使用文件对象,而无需存档中,通过在 bArchiveCompatible 参数的 FALSE

在其 “archive”兼容模式, CSocketFile 对象提供更好的性能和减少 “死锁的危险”。发生死锁,当发送的和接收的套接字相互等待,或等待公共资源。此缺陷可能发生,如果 CArchive 对象与 CSocketFile 一起使用以执行与 CFile 对象的方法。CFile,存档能假定,则为; 如果收到的字节比请求,文件结尾已到达。CSocketFile,但是,数据是基于的消息;缓冲区少于请求的字节数不提示文件尾可以包含多个消息,因此,接收。应用程序在这种情况下不阻止,它可以与 CFile,因此,它可以继续读取缓冲的消息,直到缓冲区为空时。在 CArchiveIsBufferEmpty 函数用于在监视存档的缓冲区的状态很有用。

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

请参见

参考

CObject::Serialize

概念

在MFC的Windows套接字