33 网络相关函数(一)——live555源码阅读(四)网络
本文由乌合之众 lym瞎编,欢迎转载 blog.cnblogs.net/oloroso
本文由乌合之众 lym瞎编,欢迎转载 my.oschina.net/oloroso
简介
网络相关函数是一系列用于操作网络数据的函数。在多个文件中都有相关的函数的定义。还有一些函数是系统socket API
相关函数,就不提了。
这一系列的函数大多有一个特点,需要一个UsageEnvironmet&型的参数。
这些方法大多在live555sourcecontrolgroupsockincludeGroupsockHelper.hh
中声明。
1)IsMulticastAddress多播(组播)地址判断函数
IsMulticastAddress
用于判断一个地址是否为多播(组播)地址,如果是的话返回true
,否则返回false
。
声明在文件live555sourcecontrolgroupsockincludeNetAddress.hh
中
有些应用会有这样的要求:一些分布在各处的进程需要以组的方式协同工作,组中的进程通常要给其他所有的成员发送消息。即有这样的一种方法能够给一些明确定义的组发送消息,这些组的成员数量虽然很多,但是与整个网络规模相比却很小。给这样一个组发送消息称为多点点播送,简称多播。
/ 判断参数释放是一个多播地址
Boolean IsMulticastAddress(netAddressBits address) {
// Note: We return False for addresses in the range 224.0.0.0
// through 224.0.0.255, because these are non-routable
// 注意:我们在224.0.0.0到224.0.0.255范围地址返回false,因为这些是不可路由的
// Note: IPv4-specific #####
// 注:支持IPv4特定#####
netAddressBits addressInNetworkOrder = htonl(address);
return addressInNetworkOrder > 0xE00000FF &&
addressInNetworkOrder <= 0xEFFFFFFF;
}
多播简要说明
IP多播
(也称多址广播或组播)技术,是一种允许一台或多台主机(多播源)发送单一数据包到多台主机(一次的,同时的)的TCP/IP
网络技术。多播作为一点对多点的通信,是节省网络带宽的有效方法之一。在网络音频/视频广播的应用中,当需要将一个节点的信号传送到多个节点时,无论是采用重复点对点通信方式,还是采用广播方式,都会严重浪费网络带宽,只有多播才是最好的选择。多播能使一个或多个多播源只把数据包发送给特定的多播组,而只有加入该多播组的主机才能接收到数据包。目前,IP多播技术被广泛应用在网络音频/视频广播、AOD/VOD、网络视频会议、多媒体远程教育、“push”
技术(如股票行情等)和虚拟现实游戏等方面。
IP多播通信
必须依赖于IP多播地址
,在IPv4
中它是一个D
类IP地址,范围从224.0.0.0
到239.255.255.255
,并被划分为局部链接多播地址、预留多播地址和管理权限多播地址三类。其中,局部链接多播地址范围在224.0.0.0~224.0.0.255,这是为路由协议和其它用途保留的地址,路由器并不转发属于此范围的IP包;预留多播地址为224.0.1.0~238.255.255.255
,可用于全球范围(如Internet)或网络协议;管理权限多播地址为239.0.0.0~239.255.255.255
,可供组织内部使用,类似于私有IP地址,不能用于Internet,可限制多播范围。
使用同一个IP多播地址接收多播数据包的所有主机构成了一个主机组,也称为多播组。一个多播组的成员是随时变动的,一台主机可以随时加入或离开多播组,多播组成员的数目和所在的地理位置也不受限制,一台主机也可以属于几个多播组。此外,不属于某一个多播组的主机也可以向该多播组发送数据包。
多播编程简述
1.流程
1>建立一个socket
;
2>设置多播的参数,例如超时时间TTL
,本地回环许可LOOP
等
3>加入多播组
4>发送和接收数据
5>从多播组离开
2.多播程序设计使用setsockopt()
函数和getsockopt()
函数来实现,组播的选项是IP层的。
3.setsockopt()
的选项
1>IP_MULTICAST_TTL:设置多播组数据的TTL值(路由跳数),每跨过一个路由器,TTL值减一.范围为0~255之间的任何值。
int ttl;
setsockopt(sock_fd,IPPROTO_IP,IP_MULTICAST_TTL,&ttl,sizeof(ttl));
2>IP_MULTICAST_LOOP
:默认情况下,当本机发送组播数据到某个网络接口时,在IP层,数据会回送公道本地的回环接口,选项IP_MULTICAST_LOOP
用于控制数据是否回送到本地的回环接口。
int loop;
setsockopt(sock_fd,IPPROTO_IP,IP_MULTICAST_LOOP,&loop,sizeof(loop));
参数loop
设置为0
表示禁止回送,设置为1
允许回送。
3>IP_ADD_MEMBERSHIP
: 该选项通过对一个结构struct ip_mreq类型的变量进行控制而加入一个多播组。
struct ip_mreq
{
struct in_addr imr_multiaddr;/*加入的多播组IP地址*/
struct in_addr imr_interface;/*加入的网络接口IP地址*/
};
选项IP_ADD_MEMBESHIP
选项用于加入某个多播组,之后就可以向这个多播组发送数据或者从多播组接收数据。此选项的值为mreq
结构,成员imr_multiaddr
是需要加入的多播组IP地址
,成员imr_interface
是本机需要加入多播组的网络接口IP
地址。
struct ip_mreq mreq;
setsockopt(sock_fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq));
使用IP_ADD_MEMBERSHIP
选项每次只能加入一个网络接口的IP
地址到多播组,但并不是一个多播组仅允许一个
主机IP地址加入,可以多次调用IP_ADD_MEMBERSHIP
选项来实现多个IP地址加入同一个多播组,或者同一个IP地址加入多个多播组。当imr_interface
为INADDR_ANY
时,选择的本地默认网口。
4>IP_DROP_MEMBERSHIP
:该选项用于从一个多播组中退出。
struct ip_mreq mreq;
setsockopt(sock_fd,IPPROTP_IP,IP_DROP_MEMBERSHIP,&merq,sizeof(sreq));
实例:
- 情景:
- 服务器端每隔2秒向目的端口号为5000和目的多播地址为224.0.0.255发送数据welcome you to multicast socket programme。
- 客户端从多播地址为224.0.0.255和端口号5000处接收5次多播数据。