C语言程序员

Windows Sockets:套接字通知

2019-03-05  本文已影响5人  1cbd7f94d3ea

本文描述套接字类中的通知函数。这些成员函数都是回调函数,框架调用它们将重要事件通知给套接字对象。通知函数有:

OnReceive:通过调用 Receive 通知此套接字缓冲区中有需要检索的数据。

OnSend:通过调用 Send 通知此套接字现在可以发送数据。

OnAccept:通过调用 Accept 通知此侦听套接字可以接受挂起的连接请求。

OnConnect:通知此连接套接字其连接尝试已完成:可能成功,也可能存在错误。

OnClose:通知此套接字它连接的套接字已关闭。

注意: 一个附加的通知函数是 OnOutOfBandData。此通知告诉接收套接字发送套接字有“带外”数据要发送。带外数据是逻辑上独立的通道,与每一对已连接的流式套接字关联。带外通道通常用于发送“紧急”数据。MFC 支持带外数据。使用 CAsyncSocket 类的高级用户可能需要使用带外通道,但 CSocket 类的用户最好不要使用它。更简便的方法是创建另一个套接字来传递这种数据。有关带外数据的更多信息,请参见 Platform SDK 中的 Windows Sockets 规范。

如果从 CAsyncSocket 类派生类,则必须为应用程序感兴趣的网络事件重写通知函数。如果从 CSocket 类派生类,则可以选择是否重写感兴趣的通知函数。也可以使用 CSocket 自身,在此情况下,通知函数默认不执行任何操作。

这些函数都是可重写的回调函数。 CAsyncSocket 和 CSocket 将消息转换成通知,但如果希望使用通知函数,则必须实现它们的响应方式。当套接字被通知有感兴趣的事件(如存在要读取的数据)时,调用通知函数。

MFC 调用通知函数以允许您在套接字被通知时自定义其行为。例如,您可能从 OnReceive 通知函数调用 Receive ,即,当获得有要读取的数据的通知时,可调用 Receive 读取该数据。这种方法不是必需的,但它是一个有效的方案。另一种办法是,可以使用通知函数来跟踪进度、打印 TRACE 消息等。

可以通过在派生的套接字类中重写通知函数并提供实现来利用这些通知。有关实现示例,请参见 MFC 示例 CHATTER 和 CHATSRVR 中的通知函数重写。

在如接收或发送数据的操作过程中, CSocket 对象变为同步。在同步状态中,当前套接字等待它想要的通知的同时,对应其他套接字的通知都排队等候。(例如,在 Receive 调用过程中,套接字想要读取通知)。一旦套接字完成其同步操作并再次变为异步时,其他套接字才能开始接收排队的通知。

注意: 在 CSocket 中,永远都不调用 OnConnect 通知函数。对于连接,则调用 Connect ,它将在连接完成时返回(成功或者错误)。如何处理连接通知是 MFC 实现的细节。

上一篇下一篇

猜你喜欢

热点阅读