CSocket选件类
从 CAsyncSocket比派生,继承其 Windows 套接字 API 的封装,表示较高级别的抽象 CAsyncSocket 对象。
class CSocket : public CAsyncSocket
成员
公共构造函数
名称 |
描述 |
---|---|
构造 CSocket 对象。 |
公共方法
名称 |
描述 |
---|---|
附加 SOCKET 句柄 CSocket 对象。 |
|
移除当前正在进行阻止的调用。 |
|
创建一个套接字。 |
|
返回指向 CSocket 对象命名 SOCKET 处理。 |
|
确定块是否调用正在进行。 |
受保护的方法
名称 |
描述 |
---|---|
调用过程等待消息,当等待块调用时完成。 |
备注
CSocket 与选件类 CSocketFile 和 CArchive 使用管理发送和接收数据。
CSocket 对象还提供块,对 CArchive的同步操作非常重要。 块函数,例如 Receive,Send,ReceiveFrom,SendTo,并且,Accept (所有继承 CAsyncSocket),则不会返回在 CSocket的一个 WSAEWOULDBLOCK 错误。 相反,这些函数等待,直到操作完成。 此外,原始的调用将停止与该错误 WSAEINTR,如果 CancelBlockingCall 调用,当其中一种功能块时。
若要使用 CSocket 对象,请调用构造函数,然后调用 Create 创建基础 SOCKET 句柄 (类型 SOCKET)。 Create 的默认参数创建流,套接字,但,则使用具有 CArchive 对象的套接字,可以指定参数创建数据进行套接字,或者绑定到特定端口创建服务器套接字。 在客户端上使用服务器端,的 Connect 和 Accept 连接到客户端套接字。 然后创建一 CSocketFile 对象并将它设置为 CSocketFile 构造函数的 CSocket 对象。 接下来,创建发送的一 CArchive 对象和一个收到的数据 (根据需要),然后将它们与 CArchive 构造函数的 CSocketFile 对象。 当通信完成时,销毁 CArchive、CSocketFile和 CSocket 对象。 SOCKET 数据类型在文章 Windows 套接字:背景所述。
当您使用 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 套接字在静态链接的 MFC 应用程序时的辅助线程,则必须对使用套接字初始化套接字库的每个线程的 AfxSocketInit。默认情况下,AfxSocketInit 在主线程仅调用。
有关更多信息,请参见 在 MFC 的 Windows 套接字,Windows 套接字:使用套接字与存档,Windows 套接字:套接字具有如何的存档工作,Windows 套接字:操作的顺序,Windows 套接字:套接字的示例使用中的存档。
继承层次结构
CSocket
要求
标头: afxsock.h