Windows套接字:套接字具有如何的存档工作
本文说明 CSocket 对象、 CSocketFile 对象和对象 CArchive 如何合并简化发送和接收数据通过窗口存储。
这篇文章 Windows 套接字:套接字的示例使用中的存档 存在 PacketSerialize 功能。在 PacketSerialize 示例中的存档对象工作原理非常类似于存档对象传递到 MFC 序列化 功能。这个重要区别是套接字的,存档附加而非标准 C 文件 对象 (通常与磁盘文件),但对 CSocketFile 对象。而不是连接到磁盘文件, CSocketFile 对象连接到 CSocket 对象。
CArchive 对象管理缓冲区。当单元 (发送) 的缓冲区存档已满,一个关联的 CFile 对象写出缓冲区的内容。刷新存档的缓冲区附加到套接字与发送消息是等效的。当加载 (接收) 的缓冲区存档已满, CFile 对象停止读取,直到缓冲区再次可用。
类 CSocketFile 从 CFile派生,但是,它不支持 C 文件 成员函数 (如定位功能 (Seek、 GetLength, SetLength,等等),死锁功能 (LockRange, UnlockRange),或者 GetPosition 功能。所有 CSocketFile 对象必须执行是写入或读取的字节数序列化为从关联的 CSocket 对象。该文件不是包含的操作,例如 Seek 和 GetPosition 没有意义。CSocketFile 从 CFile派生,因此,它通常将继承所有这些成员函数。若要防止出现这种情况,不支持的 CFile 成员函数在 CSocketFile 重写引发 CNotSupportedException。
CSocketFile 对象调用其 CSocket 对象的成员函数发送或接收数据。
下图显示了这些对象之间的关系在窗体的通信双方。
CArchive、CSocketFile 和 CSocket
此清单的复杂的目的是防止您管理套接字的详细信息必要性。您创建套接字、文件和存档,然后启动发送或接收数据通过插入到存档或提取它从存档。CArchive、 CSocketFile和 CSocket 在后台管理详细信息。
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,因此,它可以继续读取缓冲的消息,直到缓冲区为空时。在 CArchive 的 IsBufferEmpty 函数用于在监视存档的缓冲区的状态很有用。
有关更多信息,请参见 Windows 套接字:使用套接字与存档