1. 程式人生 > >多播套接字選項分析

多播套接字選項分析

一、IP_ADD_MEMBERSHIP、IPV6_JOIN_GROUP和MCAST_JOIN_GROUP

在一個指定的本地介面上面新增一個不限源的多播組。我們將會有以下三個結構來表示新增和離開多播組

struct ip_mreq{
	struct in_addr imr_multiaddr;   /*ipv4 class D multicast addr*/
	struct in_addr imr_interface;   /* ipv4 addr of local interface*/
};

struct ip_mreq{
	struct in6_addr ipv6imr_multiaddr;   /*ipv6 multicast addr*/
	unsigned int ipv6mr_interface  /*interface index, or 0*/
};

struct group_req{
	unsigned int gr_interface;    /*interface index, or 0*/
	struct sockaddr_storage gr_group;    /*ipv6 or ipv4 multicast addr*/
};

分析如下:

1)、一個套接字可以多次加入多個多播組, 但是多播組的地址必須不同,又或者是在不同介面上的同一個多播地址。

2)、在MCAST_JOIN_GROUP中, 我們支援IPv4和IPv6, 其中sockaddr_storage支援存放在系統當中的任何型別的地址。

3)、如果指定的IPv4中的地址是INADDR_ANY或者IPv6值為0的索引,那麼核心將會自動選擇一個本地的介面。

4)、大多數的實現實現允許套接字上加入多播組的次數是有限的 。 ipv4的這個限制是常值IP_MAX_MEMBERSHIPS。

二、IP_DROP_MEMBERSHIP、IPV6_LEAVE_GROUP和MCAST_LEAVE_GROUP

離開指定本地介面的一個不限源的多播組

1)、如果未指定本地介面(IPV4和INADDR_ANY或者IPV6為0的介面索引),那麼將會抹除首個匹配的多播組成員關係。

2)、當相應的套接字關閉又或者是(因顯示關閉《close》,又或者是程序終止), 那麼多播組和套接字的成員關係將會自動抹除

3)、單個主機上多個套接字加入相同的多播組,這樣, 單個套接字的抹除並影響其他成員之間的關係

三、IP_BLOCK_SOURCE和MCAST_BLOCK_SOURCE

對於一個所指定本地介面上已存在的一個不限源的多播組, 在本套接字上阻塞接受來之某個源的多播分組。
struct ip_mreq_source{
	struct in_addr imr_multiaddr;	// ipv4 class D multicast addr.
	struct in_addr imr_sourceaddr;  //ipv4 source addr.
	struct in_addr imr_interface;   // ipv4 addr of local interface.
};

struct group_source_req{
	unsigned int gsr_interface;    //interface index, or 0.
	struct sockaddr_storage gsr_group;    // ipv4 or ipv6 multicast addr.
	struct sockaddr_storage gsr_source;   // ipv4 or ipv6 source addr.
};
分析:

1)、如果加入同一個多播組的所有套接字堵塞同一個源, 那麼主機系統可以通知路由器無須分流。

2)、該套接字選項可用於忽略譬如說來子無賴傳送程序的分組流通。

3)、源堵塞請求修改已存在的組成員關係,因此必須使用IP_ADD_MEMBERSHIP, IPV6_ADDR_MEMBERSHIP, MCAST_JOIN_GROUP在相應的介面上加入對應的多播分組。

四、IP_UNBLOCK_SOURCE和MCAST_UNBLOCK_SOURCE

開通先前被堵塞的源

1)、 如果本指定本地介面(也就是對於ipv4的INADDR_ANY, 又或者是與協議無關的api為0的索引), 那麼將會開通首個匹配的被堵塞源

五、IP_ADD_SOURCE_MEMBERSHIP和MCAST_JOIN_SOURCE_GROUP

在一個指定的本地介面上加入一個特定於源的多播組。

1)、特定於源的多播組加入絕不允許使用IP_ADD_MEMBERSHIP, IPV6_ADDR_MEMBERSHIP, MCAST_JOIN_GROUP加入多播組

2)、如果指定的IPv4中的地址是INADDR_ANY或者IPv6值為0的索引,那麼核心將會自動選擇一個本地的介面。

六、IP_DROP_SOURCE_MEMBERSHIP和MCAST_LEAVE_SOURCE_GROUP

在指定的本地介面上離開一個特定於源的多播組

1)、如果未指定本地介面(IPV4和INADDR_ANY或者IPV6為0的介面索引),那麼將會抹除首個匹配的特定於源的多播組成員關係。

2)、當相應的套接字關閉又或者是(因顯示關閉《close》,又或者是程序終止), 那麼特定於源的多播組和套接字的成員關係將會自動抹除

3)、單個主機上多個套接字加入相同的特定於源的多播組,這樣,單個套接字的抹除並影響其他套接字的關係。

七、IP_MULTICAST_IF和IPV6_MULTICAST_IF

指定通過本套接字發的多播資料報的外出介面。

1)、ipv4版本, 有in_addr決定, 而ipv6將會由某個介面索引指定。

2)、ipv4位INADDR_ANY或者ipv6為0的介面索引, 那麼先前通過本套接字指定的任何介面都將會被抹除, 系統改為每次傳送套接字的外出介面。

3)、每次需要區分當程序加入多播組時的指定本地介面。

八、IP_MULTICAST_TTL和IPV6_MULTICAST_HPOS

給外出的多播資料報設定iPv4的TTL或者ipv6的跳限。

1)、如果為設定, 將或自動預設為1