分享

CSocket Class

 牛人的尾巴 2017-01-05

CSocket Class

Visual Studio 2015
 

发布日期: 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的同步操作非常重要。 块函数,例如 ReceiveSendReceiveFromSendTo,并且,Accept (所有继承 CAsyncSocket),则不会返回在 CSocket的一个 WSAEWOULDBLOCK 错误。 相反,这些函数等待,直到操作完成。 此外,原始的调用将停止与该错误 WSAEINTR,如果 CancelBlockingCall 调用,当其中一种功能块时。

若要使用 CSocket 对象,请调用构造函数,然后调用 Create 创建基础 SOCKET 句柄 (类型 SOCKET)。 Create 的默认参数创建流,套接字,但,则使用具有 CArchive 对象的套接字,可以指定参数创建数据进行套接字,或者绑定到特定端口创建服务器套接字。 在客户端上使用服务器端,的 Connect 和 Accept 连接到客户端套接字。 然后创建一 CSocketFile 对象并将它设置为 CSocketFile 构造函数的 CSocket 对象。 接下来,创建发送的一 CArchive 对象和一个收到的数据 (根据需要),然后将它们与 CArchive 构造函数的 CSocketFile 对象。 当通信完成时,销毁CArchiveCSocketFile和 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
   }
}

System_CAPS_ICON_note.jpg 说明

在使用 MFC 套接字在静态链接的 MFC 应用程序时的辅助线程,则必须对使用套接字初始化套接字库的每个线程的 AfxSocketInit。 默认情况下,AfxSocketInit 在主线程仅调用。

有关更多信息,请参见 在 MFC 的 Windows 套接字Windows 套接字:使用套接字与存档Windows 套接字:套接字具有如何的存档工作Windows 套接字:操作的顺序Windows 套接字:套接字的示例使用中的存档

CObject

CAsyncSocket

CSocket

标头: afxsock.h

CAsyncSocket Class
层次结构图
CAsyncSocket Class
CSocketFile Class

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多