多播与广播

多播

多播方式的数据传输是基于UDP完成的,也就是说多播数据包的格式与UDP数据包相同。只是与一般的UDP数据包不同,向网络传递一个多播数据包时,路由器将复制该数据包并传递到多个主机,多播需要借助路由器完成。采用多播方式时,可以同时向多个主机传递数据。

多播的数据传输特点:

1. 多播服务器端针对特定多播组,只发送1次数据。

2. 即使只发送1次数据,但该组内的所有客户端都会接收数据

3. 多播组数可在IP地址范围内任意增加

4. 加入特定组即可接收发往该多播组的数据

多播组是D类地址

为了传递多播数据包,必须设置TTL。TTL用整数表示,并且每经过一个路由器就减1 。TTL变为0时,该数据包无法再被传递,只能销毁。因此,TTL的值设置过大将影响网络流量,设置过小也会无法传递到目标。

设置TTL

设置TTL相关的协议层为IPPROTO_IP , 选项名为IP_MULTICAST_TTL 。

int send_sock;

int time_live = 64;

......

send_sock = socket(PF_INET , SOCK_DGRAM , 0);

setsockopt(send_sock , IPPROTO_IP , IP_MULTICAST_TTL , (void*)&time_live , sizeof(time_live));

......

加入多播组也通过设置套接字选项完成:

加入多播组相关的协议层为IPPROTO_IP , 选项名为IP_ADD_MEMBERSHIP 。

int recv_sock;

struct ip_mreq join_adr;

......

recv_sock = socket(PF_INET , SOCK_DGRAM , 0);

......

join_adr.imr_multiaddr.s_addr = “多播组地址信息”;

join_adr.imr_interface.s_addr = “加入多播组的主机地址信息”;

setsockopt(recv_sock , IPPROTO_IP , IP_ADD_MEMBERSHIP, (void*)&join_adr , sizeof(join_adr));

......

struct ip_mreq

{

        struct in_addr imr_multiaddr; //写入加入的组IP地址

        struct in_addr imr_interface; //加入该组的套接字所属主机的IP地址,也可使用INADDR_ANY

}



广播

多播即使在跨越不同网络的情况下,只要加入多播组就能接收数据。相反,广播只能向同一网络中的主机传输数据。

广播是向同一网络中的所有主机传输数据的方法。广播也是基于UDP完成的。

根据传输数据时使用的IP地址的形式,广播分为:直接广播、本地广播。

直接广播的IP地址中除了网络地址外,其余主机地址全部设置为1。例如,希望向网络地址192.12.34中的所有主机传输数据时,可以向192.12.34.255传输。换言之,可以采用直接广播的方式向特定区域内所有主机传输数据。

本地广播中使用的IP地址限定为255.255.255.255。例如,192.32.24网络中的主机向255.255.255.255传输数据时,数据将传递到192.32.24网络中的所有主机。

默认生成的套接字会阻止广播,因此,只需通过如下代码更改默认设置:

int send_sock;

int bcast = 1;     //对变量进行初始化以将SO_BROADCAST选项信息改为1

......

send_sock = socket(PF_INET , SOCK_DGRAM , 0);

......

setsockopt(send_sock , SOL_SOCKET , SO_BROADCAST , (void*)&bcast , sizeof(bcast));

......

上述套接字选项只需在发送者中更改,接收者的实现不需要该过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值