发布日期: 2016年7月
若要了解有关 Visual Studio 2017 RC 的最新文档,请参阅 Visual Studio 2017 RC 文档。
从 CAsyncSocket
比派生,继承其 Windows 套接字 API 的封装,表示较高级别的抽象 CAsyncSocket
对象。
class CSocket : public CAsyncSocket
名称 | 描述 |
---|---|
CSocket::CSocket | 构造 CSocket 对象。 |
名称 | 描述 |
---|---|
CSocket::Attach | 附加 SOCKET 句柄 CSocket 对象。 |
CSocket::CancelBlockingCall | 移除当前正在进行阻止的调用。 |
CSocket::Create | 创建一个套接字。 |
CSocket::FromHandle | 返回指向 CSocket 对象命名 SOCKET 处理。 |
CSocket::IsBlocking | 确定块是否调用正在进行。 |
名称 | 描述 |
---|---|
CSocket::OnMessagePending | 调用过程等待消息,当等待块调用时完成。 |
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 应用程序时的辅助线程,则必须对使用套接字初始化套接字库的每个线程的 |
有关更多信息,请参见 在 MFC 的 Windows 套接字,Windows 套接字:使用套接字与存档,Windows 套接字:套接字具有如何的存档工作,Windows 套接字:操作的顺序,Windows 套接字:套接字的示例使用中的存档。
CSocket
标头: afxsock.h
联系客服