IGMP協議運行于主機和與主機直接相連的組播路由器之間,主機通過此協議告訴本地路由器希望加入并接受某個特定組播組的信息,同時路由器通過此協議周期性地查詢局域網內某個已知組的成員是否處于活動狀態(即該網段是否仍有屬于某個組播組的成員),實現所連網絡組成員關系的收集與維護。IGMP有三個版本,IGMPv1由RFC1112定義,目前通用的是IGMPv2,由RFC2236定義。IGMPv3目前仍然是一個草案。IGMPv1中定義了基本的組成員查詢和報告過程,IGMPv2在此基礎上添加了組成員快速離開的機制,IGMPv3中增加的主要功能是成員可以指定接收或指定不接收某些組播源的報文。這里著重介紹IGMPv2協議的功能。
涇源ssl適用于網站、小程序/APP、API接口等需要進行數據傳輸應用場景,ssl證書未來市場廣闊!成為成都創新互聯公司的ssl證書銷售渠道,可以享受市場價格4-6折優惠!如果有意向歡迎電話聯系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!
IGMPv2通過查詢器選舉機制為所連網段選舉唯一的查詢器。查詢器周期性的發送普遍組查詢消息進行成員關系查詢;主機發送報告消息來應答查詢。當要加入組播組時,主機不必等待查詢消息,主動發送報告消息。當要離開組播組時,主機發送離開組消息;收到離開組消息后,查詢器發送特定組查詢消息來確定是否所有組成員都已離開。
通過上述IGMP機制,在組播路由器里建立起一張表,其中包含路由器的各個端口以及在端口所對應的子網上都有哪些組的成員。當路由器接收到某個組G的數據報文后,只向那些有G的成員的端口上轉發數據報文。至于數據報文在路由器之間如何轉發則由路由協議決定,IGM
socket創建UDP通信描述符后,setsockopt加入多播組,再bind綁定到該網卡上
//在指定的IP和端口上接收多播組的報文
int??recv_msg(char??*ip???,?unsigned??short??port?,?char??*mult_ip?)
{
//建立通訊套接字
int??fd?=?socket(?PF_INET?,?SOCK_DGRAM?,?0?);
if(?-1?==?fd?)
{
perror("socket?failed");
return??-1;
}
//設置地址重用和接收多播
{
int??reuse?=?1?;
struct??ip_mreqn??mult_addr?=?{0};
mult_addr.imr_multiaddr.s_addr?=?inet_addr(?mult_ip?);
mult_addr.imr_address.s_addr?=?inet_addr(?ip?);
if(?-1?==?setsockopt(?fd?,?IPPROTO_IP?,?IP_ADD_MEMBERSHIP?,
mult_addr?,?sizeof(mult_addr)))
{
perror("setsockopt?add?failed");
goto??_out;
}
if(?-1?==?setsockopt(?fd?,?SOL_SOCKET,?SO_REUSEADDR,
reuse?,?sizeof(reuse)?)?)
{
perror("setsockopt?reuse?failed");
}
}
//綁定地址和端口
{
struct??sockaddr_in??addr?=?{0};
addr.sin_family?=?PF_INET;
addr.sin_port?=?htons(?port?);
addr.sin_addr.s_addr?=?INADDR_ANY;
if(?-1?==?bind(?fd?,?(struct?sockaddr*)addr?,
sizeof(addr)?)?)
{
perror("bind?failed");
goto??_out;
}
}
//接收信息
while(1)
{
char??buf[128]?=?{0};
int???ret??=?0?;
struct?sockaddr_in??client_addr?=?{0};
int??len?=?sizeof(client_addr)?;
ret?=?recvfrom(?fd?,?buf?,?sizeof(buf),?0?,?
(struct?sockaddr*)client_addr?,
len?);
//被信號中斷則重啟
if(?(-1?==?ret)(EINTR?==errno?))
{
continue;
}
else?if(?-1?==ret?)
{
perror("recvfrom?failed");
goto??_out;
}
else?if(?ret?0?)
{
printf("%s\n"?,?buf?);
}
usleep(?100*1000?);
}
_out:
if(?fd?=?0)
{
close(?fd?);
}
return??0;
}
這就要有PIM(Protocol Independent Multicast,協議無關組播組)協議的支持,就必須在Linux環境下安裝Pimd軟件協議包。 安裝補丁文件 安裝Pimd軟件協議包需要兩個補丁文件:pimkern-freebsd-4.6.patch和netstat-freebsd-4.6.patch。安裝步驟如下: 首先將兩個補丁文件拷貝到/usr/src/目錄下,并執行以下命令:#patch -p2 netstat-freebsd-4.6.patch #patch -p2 pimkern-freebsd-4.6.patch 執行以下命令,編譯并安裝netstat:#cd /usr/src/usr.bin/netstat #make #make install 重新編譯內核 執行以下命令,修改multi配置文件:#cd /usr/src/sys/i386/conf/ #cp GENRIC multi #vi multi 在multi配置文件中,加入下列兩行代碼:options MROUTING options PIM 保存并退出vi編輯器。 在當前multi配置文件所在的目錄執行以下命令:#config multi #cd /usr/src/sys/compile/multi/ #make depend #make #make install 至此,新內核編譯完畢。 備份Kernel文件 新內核編譯完畢后,在重新啟動前,要先將根目錄下原有的Kernel文件進行備份。#cd / #mv kernel kernel.old 若提示“operation not permitted”,則需要先執行以下命令:#chflags noschg /kernel 備份Kernel文件后執行以下命令:#cp /usr/src/sys/compile/multi/kernel /kernel 在系統重新啟動后,默認選擇的便是新編譯的內核。 安裝Pimd軟件協議包 Linux下Pimd軟件協議包代碼的起源有兩個地方,一個是日本的KAME項目組,另一個是南加州大學信息科學學院。到這兩個組織的主頁上都可以下載所需要的pimd-current.tar.gz 協議包和上面提到的兩個補丁。 用以下命令解壓縮 pimd-current.tar.gz 軟件包,并安裝:#tar zxf pimd-current.tar.gz #cd pimd-2.1.0-alpha29.16 #make #make install 以上命令執行過程中可能會出現錯誤,需要手工將其完成,拷貝當前目錄下的pimd文件:#cp pimd /usr/local/bin/ #chmod 755 pimd #cp pimd.conf /etc/ 至此,Pimd軟件協議包安裝完畢。還需要打開Linux系統的路由轉發功能,才能實現組播包的轉發,即在配置文件rc.conf中增加以下代碼,重啟后生效。作者:龍宇翔 苑慶國
網站欄目:linux開啟組播命令 linux組播設置
網頁鏈接:http://m.kartarina.com/article16/hjocgg.html
成都網站建設公司_創新互聯,為您提供微信小程序、定制開發、手機網站建設、外貿網站建設、電子商務、網站排名
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯