多播包装类






4.91/5 (13投票s)
1999年12月4日

200086

5712
令人惊讶的是,关于 WinSock 下多播编程的资源在互联网上非常少,我认为我为我的项目编写的这个类对你们中的一些人来说会很有用。 代码注释充分,并且不难理解。 下面讨论了值得提及的要点,如果您需要任何帮助,请随时与我联系。
我将假设您已经了解了多播和套接字 API 的概念。 类 CMulticastSocket 派生自 MFC CAsyncSocket,它将允许程序员使用以下功能
- 根据其多播 IP 地址和端口加入多播主机组
- 离开主机组
- 向/从主机组发送/接收数据
- 设置发送套接字的生存时间 (TTL) 和环回选项
加入一个组
要加入多播组,可以使用以下 API 调用
Bool CMulticastSocket::JoinGroup (CString HostGroupIP, UINT nHostGroupPort, UINT nTTL, BOOL nLoopback)
如果成功,该函数返回 true,否则返回 false。
所有字段都非常不言自明,但对于那些可能尝试深入研究代码细节的人,我将提到一个与环回选项相关的技术问题。 并非所有多播接口都支持环回选项,在这种情况下,默认情况下启用环回。 任何发送到主机组的包都将环回到发送接口。 简而言之,发送者将接收他/她发送的任何包,无论他/她是否愿意。
CMulticastSocket 在内部处理此问题。 如果多播接口不支持环回选项,并且用户希望禁用环回,则该类会忽略它从用户的发送套接字的 IP/端口地址接收的任何包。 这样,您发送的任何环回到接口的消息都将被该类的 OnReceive 函数忽略。
nTTL     包含数据包的生存时间值。 TTL 确定数据包在死亡之前可以进行的跳数。
 
离开一个组
要离开您连接到的多播主机组,请使用
    Bool CMulticastSocket::LeaveGroup()
如果成功,返回 true,否则返回 false。
 
向主机组发送数据
    Bool CMulticastSocket::SendTo(const char* strMessage, int nSize)
如果成功,返回 true,否则返回 false。
strMessage 包含要发送的消息。
nSize 是消息的大小
 
从主机组接收数据
    void CMulticastSocket::OnReceive(int nErrorCode)
此函数覆盖 CAsyncSocket OnReceive 通知消息。 在此消息中,有检查以确保环回正常工作。 程序员可以在此函数中编写其代码以处理接收到的数据。
 
类数据成员
以下是类数据成员的描述。 如果您想更改代码以满足您的需求,这应该特别有用。
 
| m_mrMReq | 包含主机组 IP 和接口的 mreq 结构 | 
| m_saHostGroup | 包含主机组的 IP/端口的 SOCKADDR_IN 结构 | 
| m_SendSocket | 另一个 CAsyncSocket 对象,用于向主机组发送数据 | 
| m_strLocalIP | 包含本地机器的 IP 地址的 CString (用于强制无环回) | 
| m_nLocalPort | 包含接收套接字的端口号的 UINT (用于强制无环回) | 
| m_strBuffer | 一个包含接收数据的字符数组 | 
| m_strSendersIP | 包含数据发送到主机组的发送者的 IP 的 CString | 
| m_nSendersPort | 包含数据发送到主机组的发送者的端口号的 UINT | 
| bForceNoLoopback | 布尔值,指示是否必须强制禁用环回(不要探测。仅供内部使用) | 
