现在的位置: 首页 > 综合 > 正文

Windows套接字系列六:带存档的套接字工作原理

2013年10月10日 ⁄ 综合 ⁄ 共 1776字 ⁄ 字号 评论关闭

本文介绍了如何CSocket对象,CSocketFile对象,CArchive对象相结合,以方便地通过Windows套接字发送和接收数据。

文章的Windows Sockets:使用存档的套接字示例介绍了PacketSerialize功能。在PacketSerialize例如归档对象的工作原理非常类似于归档对象传递到一个MFC
Serialize函数。
本质上的区别是,插座,归档CFile对象标准(通常与磁盘文件关联),但不附加到CSocketFile对象。CSocketFile对象,而不是连接到一个磁盘文件,连接到一个CSocket对象。

CArchive对象管理一个缓冲区。当一个存储(发送)存档的缓冲区已满,相关​​的CFile对象写入缓冲区的内容。法拉盛套接字连接到一个存档的缓冲区相当于发送一条消息。当缓冲区已满负荷(接收)归档,CFile对象停止阅读,直到缓冲区再次可用。

类CSocketFile从CFile派生,但它不支持定位功能,如CFile的成员函数(寻求,GetLength的,中用SetLength,等等),锁定功能(LockRange,UnlockRange),或的GetPosition功能。所有CSocketFile对象必须做的是读或写或从关联的CSocket对象的字节序列。因为不涉及一个文件,为寻求和GetPosition等操作就没有任何意义。CSocketFile从CFile派生,所以它通常会继承所有这些成员函数。为了防止这种情况,不支持CFile的成员函数都是在CSocketFile重写以抛出一个CNotSupportedException。

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

下图显示了这些对象之间的关系对双方的沟通。

的CArchive,CSocketFile和CSocket

 
这种明显的复杂性的目的是要保护你从自己的套接字的细节管理的必要性。你创建套接字,文件和档案,然后开始发送或接收数据,通过插入到存档或从存档中提取。的CArchive,CSocketFile和CSocket管理幕后的细节。

CSocket对象实际上是两个国家的对象:有时异步(通常状态),有时同步。在异步状态,套接字可以接收来自框架的异步通知。然而,在操作,如接收或发送数据的套接字变得同步。这意味着套接字将收到没有进一步的异步通知,直到同步操作已完成。因为它切换模式,你可以,例如,像下面这样:

复制
 
CMySocket :: OnReceive()
{
    
/ / ...
    
AR >> STR;
    
/ / ...
}
如果不被视为两个国家的对象实施的CSocket,它有可能收取额外的同类事件的通知,而你处理先前的通知。例如,你可能会得到一个OnReceive通知,而处理1
OnReceive。
在上面的代码片段,从归档中提取的STR可能导致递归。通过开关状态,CSocket的防止递归防止额外的通知。一般的规则是在通知没有通知。

注意
一个CSocketFile也可以用来作为(有限)文件,没有一个CArchive对象。默认情况下,,CSocketFile构造的bArchiveCompatible的参数是TRUE。这指定该文件的对象是使用归档。没有使用归档文件对象,通过假在bArchiveCompatible参数。
 

在“存档兼容”模式,CSocketFile对象提供更好的性能和降低危险的“死结”。死锁发生时,无论是发送和接收套接字等待对方,或等待着一个共同的资源。这种情况可能发生,如果CArchive对象CFile对象的方式,它与CSocketFile工作。归档与CFile的,可以假设,如果它接收到较少的字节,比要求,已达到文件末尾。然而,与CSocketFile,数据是基于消息的缓冲区可以包含多个消息,所以接收比请求的字节数少并不意味着文件结束。在这种情况下,应用程序不会阻止,因为它可能与CFile的,它可以继续从缓冲区中读取消息,直到缓冲区是空的。的CArchive的IsBufferEmpty的功能是监测在这种情况下,归档的缓冲区的状态非常有用。

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

参见
参考
CObject的::序列

概念
在MFC中的Windows Sockets

抱歉!评论已关闭.