TCP/IP网络编程第14章多播与广播复习总结

关于多播

多播方式的数据传输时基于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地址就行。
多播广播系列完结。

发布了75 篇原创文章 · 获赞 26 · 访问量 7675

猜你喜欢

转载自blog.csdn.net/qq_40962234/article/details/104250680