关于多播

     广播把数据发送给网络中的每个地址,不同与广播,多播仅将数据发送给明确登记的且对数据感兴趣的地址。

     在一个支持多播的IP网络上,如果你想收到多播数据包,就必须连接入一个多播组。如果你是所发送多播数据包目的地组中的成员,同样也将收到一份你所发数据的拷贝。一个客户不会收到所有从多播组中发来的数据包,除非数据包被发至socket响应的端口。因此明智的作法是将所有的客户机连接到多播组,并在同一端口上等待循环数据,然后服务器将单个数据包发送到多播组中,党信息沿着路线被重复的操作,将发送到所有客户机上。

      连接多播组与接收多播数据包:首先绑定你的UDP套接口至一个本地端口。

      SOCKADDR_IN addrLocal;

     addrLocal.sin_family = AF_INET;

     addrLocal.sin_addr.s_addr = INADDR_ANY; //USE ANY LOCAL ADDRESS

     addrLocal.sin_port = htons(uiPort);

     if(SOCKET_ERROR == bind(hUDPSocket,(LPSOCKADDR)&addrLocal,

                                               sizeof(struct sockaddr)))

     { cout << "Euston,we have a problem";}

 

     然后调用setsockopt()

     int WSAAPI setsockopt(SOCKET s,int level,int optname,

                                           const char FAR * optval,int optlen);

      s为socket 句柄,level设置成IPPROTO_IP、optname设置成IP_ADD_MEMBERSHIP、optval指向一个p_mreq结构体指针、optlen为长度。

      其中p_mreq结构体如下:

    struct ip_mreq {
      struct in_addr imr_multiaddr;  
      struct in_addr imr_interface;  
    }

      两个域都是in_addr结构体,imr_multiaddr指定跟进多点传送组的地址,而imr_interface指定局部地址INADDR_ANY,专门为多播组分配的地址从:224.0.1.0到239.255.255.255,你可以选择一个作为跟进地址,将其防到imr_multiaddr中。下面调用setsockopt()

      struct ip_mreq mreq;

      mreq.imr_multiaddr.s_addr = inet_addr("234.5.6.7");

      mreq.imr_interface.s_addr = INADDR_ANY;

      nRet = setsockopt(hUDPSocket,IPPROTO_IP,IP_ADD_MEMBERSHIP,                     

                                    (char *) &mreq,sizeof(mreq));

      需要检测nRet的返回值

      接收组播中数据 SOCKADDR_IN addrSrc;//保存接收来的地址信息

      nRet = recvfrom(hUDPSocket,(char *)&Data,sizeof(Data),0,

                                (struct sockaddr*)&addrSrc,sizeof(addrSrc));

      如果想结束与该组的关系,并离开这个组,只需调用setsockopt函数且调用除IP_ADD_MEMBERSHIP参数外的同类参数如:IP_DROP_MEMBERSHIP

      nRet = setsockopt(hUDPSocket,IPPROTO_IP,IP_DROP_MEMBERSHIP,

                                   (char *)&mreq,sizeof(mreq));

      通过函数sendto()函数向多播组发送数据包,需要指定你的多播组地址作为目标IP,和你指定的端口号,先来了解下IP多播的Winsock选项,有三个IP多播选项,IP_MULTICAST_TTL,IP_MULTICAST_IF,IP_MULTICAST_LOOP,IP_MULTICAST_TTL,设置多播数据的生存时间,默认情况为1,遇到第一个路由器便被丢弃,增大TTL的值,就会经历多个路由器传到其它网络,TTL的值为多少,就是经过多少个路由器。

      TTL equal to 0 Restricted to the same host
  TTL equal to 1 Restricted to the same subnet
  TTL equal to 32 Restricted to the same site
  TTL equal to 64 Restricted to the same region
  TTL equal to 128 Restricted to the same continent
  TTL equal to 255 Unrestricted in scope

 

     通过setsockopt函数来设定TTL的值

     char TTL =32;

     setsockopt(hUDPSocket,IPPROTO_IP,IP_MULTCAST_TTL,

                        (char *)&TTL,sizeof(TTL));

     设置号了选项就可以调用sendto()函数发送数据包

     SOCKADDR_IN addrDest;

     szHi[50];

     addrDest.sin_family = AF_INET;

     addrDest.sin_addr.s_addr = inet_addr("234.5.6.7");

     addrDest.sin_addr.s_port = htons(uiPort);

     strcpy(szHi,"Hello Multicast Group");

     nRet = sendto(hUDPSocket,(char *)szHi,sizeof(szHi),0,

                                                 (struct sockaddr*)&addrDest,sizeof(addrDest));

     这样就可以将数据发送到组播中。

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值