多播包装类






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 |
布尔值,指示是否必须强制禁用环回(不要探测。仅供内部使用) |