65.9K
CodeProject 正在变化。 阅读更多。
Home

多播包装类

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.91/5 (13投票s)

1999年12月4日

viewsIcon

200086

downloadIcon

5712

  • 下载演示项目 - 18 Kb
  • 下载源文件 - 3 Kb
  • 令人惊讶的是,关于 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 布尔值,指示是否必须强制禁用环回(不要探测。仅供内部使用)
    CMulticastSocket 的数据成员

    © . All rights reserved.