关于多播
多播方式的数据传输时基于UDP完成的。
多播的数据传输特点:
- 多播服务器端针对特定多播组,只发送一次数据
- 该组内的所有客户端都会接收数据
- 多播组数可在IP地址范围内任意增加
- 加入特定组即可接收发往多播组的数据
说白了,多播就是指定了一个组,多播服务器端只需要发送一次数据给组内即可,然后这个数据报会借助路由器传递到该组内的所有主机。
多播主要用于多媒体的实时传输。毕竟人家UDP。
为了传递多播数据报,必须要设置TTL。即Time to Live生存时间。这是决定数据包传递距离的主要因素,每经过一个路由器就会减一。当TTL变为0时,该数据包就无法再被传递了。
设置TTL的方法:
只需要修改套接字的一个可选项即可。
该选项的协议层式IPPROTO_IP, 选项名为IP_MULTICAST_TTL。
来个示例,更好理解
int send_sock;
int time_live=64;
……
send_sock = socket(PF_INET, SOCK_DGRAM, 0);
setsockopt(send_sock, IPPORTO_IP, IP_MULTICAST_TTL, (void*) &time_live, sizeof(time_live));
设置完了TTL之后,接下来是客户端加入多播组的方法
也是只需要修改套接字可选项就可。
协议层是IPPORTO_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, IPPORTO_IP, IP_ADD_MEMBERSHIP, (void*) &join_adr, sizeof(join_adr));
其中有个新的结构体ip_mreq;
struct ip_mreq{
struct in_addr imr_multiaddr;
struct in_addr imr_interface;
}
插播一个小知识:
feof 若文件结束返回非0值,若没结束返回0;
接下来是广播
首先广播和多播的区别在于,多播是向一个特定的组内传播数据,这个组内成员可以任意添加,基本上谁都可以进来。而广播是向特定网络地址的主机发送消息,不能随意挑选,得按照网络地址来。
广播分两类:
直接广播
本地广播
若希望向网络地址192.12.34中的所有主机传输数据时
对于直接广播,任意主机可以向192.12.34.255传输,就可以了。顾名思义可以直接进行广播。
对于本地广播,只有192.12.34中的主机向255.255.255.255传输数据,就可以做到。顾名思义只有本地的广播才能广播本地的所有主机。
需要注意一点就是默认生成的套接字会阻止广播。因此我们需要更改默认值,就需要修改套接字的可选项
协议层:SOL_SOCKET 选项名:SO_BROADCAST
示例:
int send_sock;
int bcast=1;
……
send_sock = socket(PF_INET, SOCK_DGRAM, 0);
……
setsockopt(send_sock, SOL_SOCKET, SO_BROADCAST, (void *)&bcast, sizeof(bcast));
将SO_BROADCAST选项设置为1,意味着可以进行数据广播。
还需要注意一下下就是更改这个可选项只需要在发送端更改就行了,很明显。
其实广播的这两种形式可UDP示例基本一摸一样,注意点传输目标的IP地址就行。
多播广播系列完结。