CSocketFile选件类
用于发送和接收在网络中使用的数据的 CFile 对象通过Windows套接字。
class CSocketFile : public CFile
成员
公共构造函数
名称 |
说明 |
---|---|
构造 CSocketFile 对象。 |
备注
可以为此附加到 CSocket 对象的 CSocketFile 对象。您还可以为和通常,附加到 CArchive 对象的 CSocketFile 对象简化发送和接收数据使用MFC序列化。
序列化(发送)数据,将其插入到存档中,调用 CSocketFile 成员函数以将数据写入 CSocket 对象。若要反序列化(接收)数据,则从存档提取。这会导致存档调用 CSocketFile 成员函数读取 CSocket 对象的数据。
![]() |
---|
除了使用 CSocketFile 外如下所述,可以将其用作独立文件对象,就象可以使用 CFile,其基类。还可以用于任何基于存档的MFC序列化功能的 CSocketFile。由于 CSocketFile 不支持所有CFile的功能,某些默认MFC序列化功能与 CSocketFile兼容。这是尤其如此 CEditView 选件类。不应尝试使用 CEditView::SerializeRaw附加到 CSocketFile 对象的 CArchive 对象序列化 CEditView 数据;使用 CEditView::Serialize。SerializeRaw 函数需要文件对象具有功能,例如 Seek,CSocketFile 没有。 |
当您使用 CArchive 和 CSocketFile 和 CSocket时,可能会遇到 CSocket::Receive 输入循环的情况( PumpMessages(FD_READ))等待请求的少量字节。这是因为,Windows套接字只允许一recv每个FD_READ通知调用,但是,CSocketFile 和 CSocket 允许多个recv每FD_READ调用。如果收到FD_READ,而没有读取数据,应用程序停止。如果不会收到另一个FD_READ,应用程序停止间通信套接字。
通过以下方式可以解决此问题。在您的套接字选件类 OnReceive 方法,请调用 CAsyncSocket::IOCtl(FIONREAD, ...),在调用您的邮件类之前 Serialize 方法,当从套接字要读取的所需的数据超过一TCP数据包时(中等的网络,通常至少1096个字节的最大传输单位的范围)。如果可用数据的大小程度低于必要,等待所有数据接收和此时开始这次读取操作。
在下面的示例中,m_dwExpected 是用户所需接收的近似字节数。假定,可以在代码中的其他位置声明它。
void CChatSocket::OnReceive(int nErrorCode)
{
CSocket::OnReceive(nErrorCode);
DWORD dwReceived;
if (IOCtl(FIONREAD, &dwReceived))
{
if (dwReceived >= m_dwExpected) // Process only if you have enough data
m_pDoc->ProcessPendingRead();
}
else
{
// Error handling here
}
}
有关更多信息,请参见 在MFC的Windows套接字、 Windows套接字:使用套接字与存档,以及 Windows套接字2 API。
继承层次结构
CSocketFile
要求
Header: afxsock.h