|
本文解释如何组合 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
上一篇:浅析c/c++中的指针
下一篇:C语言:黑客学员必修课(一)
|