組播中的setsockopt

2021-06-06 20:07:46 字數 2486 閱讀 2613

組播主機需要的環境

如果要在一台主機上執行多播程式,這台主機支援igmp協議。此協議用於加入乙個多播組,離開乙個多播組等而向路由器傳送命令。現在的igmp協議最高版本為v3(rfc3376),現在有很少數的unix實現了,windowxp己實現。大部分主機,路由器實現的版本為v2(rfc2236),而v1版本(rfc1112)的執行是從v2中可以實現。v2與v1的區別就是把v1版本中的4位版本欄位跟4位操作型別字段合併成了8位操作型別,在v1中不用使用的8位字段在v2中被稱之為最大響應時間。用c寫v2的igmp結構即為:

struct igmp

;組播需要的網路環境

如果主機想獲得多播報文,相鄰的路由器也必須支援igmp,如果想獲得internet上的多播報文,主機到server的這個路徑中所遇到的路由器必須全部支援igmp,路由器還必須支援源發現協議,如msdp,pim_dm,pim_sm等。

組播的等級

level 0  不支援ip多播

level 1    只支援向多播組傳送資料而不能接收多播組的資料

level 2    ip多播全支援

對這三個等級的理解應該從socket上。建立了乙個socket以後可以對它進行設定,看它需求什麼。一般現在存在的網路程式就就是level0了,因為它們不支援多播,如用於連線web伺服器獲取網頁內容的那個socket就應該屬於level0。

乙個演唱會現場網路直播,由於採用了多播,伺服器要向乙個多播組傳送報文,因為他不需要獲取接收者的報文,所以可以建立乙個socket只向特定的多播組傳送資料就可以了,這個socket應該就是level 1

乙個網路會議的例子,由於會議是有多個人參加的,每個人都需要接收其它人的報文,所以建立了乙個socket,首先把這個socket加入到乙個多播組,使其能接收多播組的資料,然後它也可以用這個socket向自己加入的多播組傳送自己的狀態。這個socket就應該是level 2了

組播程式設計相關的socket結構和函式

int setsockopt(socket s, int level, int optname, const char far * optval, int optlen);

int getsockopt(socket s, int level, int optname, char far * optval, int far * optlen);

level必須為ipproto_ip。不要問為什麼。這兩個函式在組播幹什麼呢?獲取系統對組播的設定(如ttl),加入乙個多播組,離開乙個多播組就用setsockopt 。optname就是在組播起到最主要作用的乙個字段,與組播相關的可取值

可取值                         setsockopt     getsockopt

ip_multicast_loop     支援          支援

ip_multicast_ttl        支援          支援

ip_multicast_if          支援          支援

ip_add_membership     支援          不支援

ip_drop_membership   支援          不支援

1.         ip_multicast_loop

當接收者加入到乙個多播組以後,再向這個多播組傳送資料,這個欄位的設定是否允許再返回到本身。

2.         ip_multicast_ttl

預設情況下,多播報文的ttl被設定成了1,也就是說到這個報文在網路傳送的時候,它只能在自己所在的網路傳送,當要向外傳送的時候,路由器把ttl減1以後變成了0,這個報文就已經被discard了。例:

char ttl;

ttl = 2;

setsockopt(s, ipproto_ip, ip_multicast_ttl, (char*)ttl, sizeof(ttl));

3.         ip_multicast_if

傳送多播報文時用的本地介面,預設情況下被設定成了本地介面的第乙個位址。

未完4.         ip_add_membership

這個option和下面的option是實現多播必不可少的,它用於加入乙個多播組,例:

struct ip_mreq ipmr;

ipmr.imr_inte***ce.s_addr = htonl(inaddr_any);

ipmr.imr_multiaddr.s_addr = inet_addr("234.5.6.7");

setsockopt(s, ipproto_ip, ip_addr_membership, (char*)&ipmr, sizeof(ipmr));

5.         ip_drop_membership

用於離開乙個多播組,使用方法同ip_addr_membership。

struct ip_mreq ipmr;

int             len;

setsockopt(s, ipproto_ip, ip_drop_membership, (char*)&ipmr, &len);

IP組播與組播協議

在internet上,多 業務諸如 圖1.1 1.ip組播 ip組播是指乙個ip報文向乙個 主機組 的傳送,這個包含零個或多個主機的主機組由乙個單獨的 ip位址標識。主機組位址也稱為 組播位址 或者d類位址。除了目的位址部分,組播報文與普通報文沒有區別,網路盡力傳送組播報文但是並不保證一定送達。主機...

組播位址,IP組播位址

ip組播位址 組播協議的位址在 ip協議中屬於 d類位址。d類位址是從 224.0.0.0 到239.255.255.255 之間的ip 位址其中 224.0.0.0 到224.0.0.255 是被保留的位址。組播協議的位址範圍類似於一般的單播位址,被劃分為兩個大的位址範圍,239.0.0.0 23...

IP組播與組播協議

在internet上,多 業務諸如 流 伺服器必須為每乙個接收者提供乙個相同內容的ip報文拷貝,同時 網路上也重複地傳輸相同內容的報文,占用了大量資源。如圖1.1所示。雖然ip廣播允許乙個主機把乙個ip報文傳送給同乙個網路的所有主機,但是由於不是所有的主機都需要這些報文,因而浪費了網路資源。在這種情...