導航:首頁 > 編程語言 > linux組播編程

linux組播編程

發布時間:2022-08-31 23:15:32

linux 內核 怎麼支持多播

應用程序通過命令字IP_ADD_MEMBERSHIP把一個socket加入到一個多播組,IP_ADD_MEMBERSHIP是一個IP層的命令字,其調用使用的參數是結構體struct ip_mreq,其定義如下: struct ip_mreq { struct in_addr imr_multiaddr; struct in_addr imr_interf...

❷ linux 怎樣加入一個多播組

應用程序通過命令字IP_ADD_MEMBERSHIP把一個socket加入到一個多播組,IP_ADD_MEMBERSHIP是一個IP層的命令字,其調用使用的參數是結構體struct ip_mreq,其定義如下:
struct ip_mreq
{
struct in_addr imr_multiaddr;
struct in_addr imr_interface;
};
該結構體的兩個成員分別用於指定所加入的多播組的組IP地址,和所要加入組的那個本地介面的IP地址。該命令字沒有源過濾的功能,它相當於實現IGMPv1的多播加入服務介面。
ip_setsockopt實現了該命令字,它通過調用ip_mc_join_group把socket加入到多播組。
表示socket的結構體struct inet_sock有一個成員mc_list,它是一個結構體struct ip_mc_socklist的指針,實際上一個該結構體的鏈表,該結構體的定義如下:
struct ip_mc_socklist
{
struct ip_mc_socklist *next;
struct ip_mreqn multi;
unsigned int sfmode;
struct ip_sf_socklist *sflist;
};

next指向鏈表的下一個節點;multi表示組信息,即在哪一個本地介面上,加入到哪一個多播組;sfmode是過濾模式,取值為
MCAST_INCLUDE或MCAST_EXCLUDE,分別表示只接收sflist所列出的那些源的多播數據報,和不接收sflist所列出的那些源
的多播數據報;sflist是源列表,結構體struct ip_sf_socklist的定義如下:
struct ip_sf_socklist
{
unsigned int sl_max;
unsigned int sl_count;
__u32 sl_addr[0];
};

sl_addr是源地址列表,sl_count應該是源地址列表中源地址的數量,sl_max應該是當前sl_addr數組的最大可容納量(不確定)。對
於通過調用IP_ADD_MEMBERSHIP加入的多播組,它會在struct inet_sock的mc_list的鏈表頭添加如下一個節點:
struct ip_mc_socklist{
.next = 原來的鏈表頭;
.multi = 所加入的多播組,和介面信息;
.sfmode = MCAST_EXCLUDE;
.sflist = NULL; 即不排除任何源地址,也就是不存在源過濾。
}
另外,一個socket所允許加入的多播組的最大數量也是有限制的,mc_list中節點的數量不允許超過sysctl_igmp_max_memberships(預設為20)。

ip_mc_join_group還需要通過ip_mreq.imr_interface的指定值找到要加入多播組的那個介面,並為介面設置狀態(即該接
口要加入哪個多播組,過濾哪些源,也就是為該介面增加一個組,如果要增加的組已存在,則增加該組的引用計數)。代表網路設備介面的結構體struct
in_device有一個成員mc_list,這是一個結構體struct ip_mc_list的鏈表,該結構體的定義如下:
struct ip_mc_list
{
struct in_device *interface;
unsigned long multiaddr;
struct ip_sf_list *sources;
struct ip_sf_list *tomb;
unsigned int sfmode;
unsigned long sfcount[2];
struct ip_mc_list *next;
struct timer_list timer;
int users;
atomic_t refcnt;
spinlock_t lock;
char tm_running;
char reporter;
char unsolicit_count;
char loaded;
unsigned char gsquery;
unsigned char crcount;
};

interface指向網路設備介面,multicast即為加入的組的多播地址,users記錄當前有幾個socket在該介面上加入了該多播組。
sfcount是一個有兩個元素的數組,分別記錄在該介面上加入多播組的socket的過濾模式為EXCLUDE和INCLUDE的數量,sfmode為
該介面本身的過濾模式。sources為源地址列表,該結構體具體內容稍後再分析。timer為主動報告定時器,當一個介面(注意:不是socket)新
加入到一個多播組,需要向多播路由器發送一個igmp報告,以通知多播路由器需要向本地網路轉發該組的數據報。tm_running是一個標志,如果
timer當前正在運行,則置1,否則置0。reporter也是一個標志,如果當前正要開始發送igmp報告,則置該標志為1,否則為0。
unsolicit_count是當一個介面新加入到一個多播組時,發送主動報告的次數,值賦為
IGMP_Unsolicited_Report_Count(預設值為2)。loaded也是一個標志,當該介面上的該多播組被加入時,需要通知硬體過
濾器,通知完成即置該標志為1,否則為0。
該結構體比較復雜,先看通過IP_ADD_MEMBERSHIP命令字把一個socket加入到一個新的多播組,會使struct in_device的mc_list中增加一個什麼樣的節點。下面是生成的節點的情況:
struct ip_mc_list{
.interface = in_dev;
.multiaddr = 多播組地址;
.source = NULL; //源過濾列表為空。
.tomb = NULL;
.sfmode = MCAST_EXCLUDE; //EXCLUDE模式,即不過濾任何源。
.sfcount[MCAST_EXCLUDE] = 1;
.sfcount[MCAST_INCLUDE] = 0;//即該節點上該多播組有一個socket加入,過濾模式為EXCLUDE。
.users = 1; //有一個用戶。
.refcnt = 1; //引用計數為1
.tm_running = 0;
.unsolicit_count = 2;
... ...
}
新生成的節點加入到mc_list鏈表中後,要通知網路設備介面的硬體,以使它的過濾機制可以接收進該多播組的數據報,同時也要通知多播路由器。

首先要把多播地址映射成乙太網地址,映射規則是把多播IP地址的低23位放到乙太網多播地址01-00-5E-00-00-00(16進制)的低23位。
因為一個IP組地址有28位有效位(除去高位的1110),所以有可能出現多個組地址被映射成同一個乙太網多播地址,具體實現見
ip_eth_mc_map。然後把這個mac地址加到硬體的過濾機制中。
具體的實現在函數dev_mc_add中。代表網路設備介面的結構體struct net_device也有一個成員mc_list,它是一個結構體struct dev_mc_list的鏈表,該結構體的定義如下:
struct dev_mc_list
{
struct dev_mc_list *next;
__u8 dmi_addr[MAX_ADDR_LEN];
unsigned char dmi_addrlen;
int dmi_users;
int dmi_gusers;
};

next指向鏈表下一個節點,dmi_addr是多播mac地址,dmi_addrlen為多播mac地址的長度,dmi_users是在節點被重復到加
入到設備上的次數,struct
net_device還有一個成員mc_count,用於記錄鏈表中節點的數量。dev_mc_add創建一個新的struct
dev_mc_list節點,加入到鏈表中,並通過調用網路設備介面的成員函數set_multicast_list來啟用設備的過濾機制。

最後一步發送主動成員報告,這里,首先忽略IGMPv1和IGMPv2存在的情況。如果要加入的多播組是
IGMP_ALL_HOSTS(224.0.0.1),則不需要發送成員報告。否則啟用定時器struct
in_device->mr_ifc_timer(介面狀態改變定時器),該定時器在設備初始化的時候被建立,其超時處理函數是
igmp_ifc_timer_expire,它發送一個IGMPv3的報告,然後再次啟用定時器。也就是說,第一個主動成員報告立即發出,然後在一個0
到IGMP_Unsolicited_Report_Interval(預設為10秒)之間的一個時間後,發出第二個主動成員報告,連續發出
IGMP_Unsolicited_Report_Count(預設值為2)個。
測試環境中要加入的多播組是224.0.1.1,發出的IGMPv3報告如下:
數據 含義
22 第3版成員關系報告
00 8bit保留,必須為0
f8 fc 校驗和
00 00 16bit保留,必須為0
00 01 組記錄的數量,為1
下面為一條組記錄:
04 類型為CHANGE_TO_EXCLUDE_MODE,改變到EXCLUDE過濾模式
00 輔助數據長度
00 00 源地址的數量
e0 00 01 01 組地址224.0.1.1

❸ linux下如何開啟multicast

socket創建UDP通信描述符後,setsockopt加入多播組,再bind綁定到該網卡上

//在指定的IP和埠上接收多播組的報文
intrecv_msg(char*ip,unsignedshortport,char*mult_ip)
{
//建立通訊套接字
intfd=socket(PF_INET,SOCK_DGRAM,0);
if(-1==fd)
{
perror("socketfailed");
return-1;
}

//設置地址重用和接收多播
{
intreuse=1;
structip_mreqnmult_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("setsockoptaddfailed");
goto_out;
}

if(-1==setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,
&reuse,sizeof(reuse)))
{
perror("setsockoptreusefailed");
}
}

//綁定地址和埠
{
structsockaddr_inaddr={0};
addr.sin_family=PF_INET;
addr.sin_port=htons(port);
addr.sin_addr.s_addr=INADDR_ANY;
if(-1==bind(fd,(structsockaddr*)&addr,
sizeof(addr)))
{
perror("bindfailed");
goto_out;
}
}

//接收信息
while(1)
{
charbuf[128]={0};
intret=0;
structsockaddr_inclient_addr={0};
intlen=sizeof(client_addr);
ret=recvfrom(fd,buf,sizeof(buf),0,
(structsockaddr*)&client_addr,
&len);
//被信號中斷則重啟
if((-1==ret)&&(EINTR==errno))
{
continue;
}
elseif(-1==ret)
{
perror("recvfromfailed");
goto_out;
}
elseif(ret>0)
{
printf("%s ",buf);
}
usleep(100*1000);
}

_out:
if(fd>=0)
{
close(fd);
}
return0;
}

❹ 如何把LINUX配置成支持IPV6組播的路由

1、配置IPv6地址 vi /tc/sysconfig/network-scripts/ifcfg-eth0 修改以下三個地方 IPV6INIT=」yes」 IPV6ADDR=2400:A480:AAAA:200::159 IPV6_DEFAULTGW=2400:A480:AAAA:200::1 2、重啟網路服務PING外網測試連通性 service netowork restart ping ipv6 3、在客戶端面遠程測試 打開遠程連接工具:SecureCRT 4、經過如上幾個步驟我們就完成了在linux操作系統下對IPv6地址的配置。

❺ 網上找的Linux環境下基於ip組播的通信實現相關代碼,怎麼一直接收不到數據,求幫忙。

Linux環境下基於ip組播的通信實現相關代碼這個其實不難來拿即可。

❻ 怎樣用Linux實現組播路由轉發

這就要有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系統的不斷普及和應用,我們在linux編程方面也取得了很大的進展,今天我們就一起來了解一下,在linux編程開發領域都有哪些開發工具值得我們學習和掌握。



但大多數人使用Nginx都停留在這幾個級別:

一:使用Nginx配置簡單的反向代理服務或者靜態資源服務,當擴展功能時發現新增的指令Nginx不支持,但又不懂如何增加Nginx模塊,如何分析access日誌。

二:可以根據源碼定製安裝Nginx,對網上流傳的大眾配置做一些個性化的修改,但遇到修改proxy_pass後的URL上游服務不正常等問題時就束手無策,不清楚Nginx各個目錄的意義,也不清楚Nginx的進程結構。

三:能夠順暢地使用Nginx的常用功能,但不清楚三方模塊發生沖突時的解決方案、stale過期緩存的用法、Nginx諸多變數是如何被賦值的、聽說if指令是邪惡的卻不知道它的設計理念及正確用法等等。

四:可以正確地使用Nginx的功能及三方模塊,並按照網路上常見的優化參數優化性能,但對如何系統化地優化性能沒有頭緒,對於Nginx、Linux提供的內存緩沖區、網路類等諸多指令和參數的優化沒有頭緒。

五:可以熟練使用Nginx,但對OpenResty的Lua模塊如何與Nginx結合使用以及對Nginx性能影響不太清楚,對Nginx源碼的理解沒有達到由點到面的程度。

六、提高Nginx能力需要從以下方面開始

1、深入理解Nginx架構

了解事件驅動機制是深入優化Nginx性能、判定三方模塊性能的基礎。而了解Nginx的進程結構,則是我們對Nginx做日常維護的必要條件,也是我們優化Nginx性能的理論基礎。另外,變數是Nginx實現模塊間解耦合的關鍵。這些知識都需要我們牢固掌握,為後面的進階學習打下堅實基礎。

2、對HTTP模塊要了如指掌

HTTP請求處理過程中分為11個階段。理解每個HTTP模塊所處的階段,並清楚該模塊在這一階段中的位置順序,有助於我們定位指令不生效或者與預期功能不符等問題,提高定位各種Bug的效率,也可以幫我們熟悉缺乏文檔的三方模塊。

3、反向代理與負載均衡

反向代理有一套通用的處理流程,雲南IT培訓http://www.kmbdqn.com/認為需要掌握反向代理處理請求的完整流程,能讓我們熟練使用HTTP協議反向代理,以及熟悉如memcached、gRPC等同類的反向代理,在優化性能時,也能對相關緩存、超時等指令更有針對性的做個性化配置。


閱讀全文

與linux組播編程相關的資料

熱點內容
日本電影叫什麼魚的名字 瀏覽:663
找書pdf 瀏覽:392
高水平應屆程序員有前途嗎 瀏覽:79
哪個視頻網站可以投屏還免費 瀏覽:283
好看愛情網 瀏覽:304
泰國電影女主叫小草 瀏覽:543
模具設計的命令如何用 瀏覽:990
華為雲桌面伺服器多少錢一台 瀏覽:271
木工數控刀具路徑編程 瀏覽:275
用電腦看高清電影在哪裡看 瀏覽:242
老外從牆壁穿越的電影 瀏覽:813
下人電影完整版下載 瀏覽:589
雲伺服器下載服務 瀏覽:241
pdf如何插入頁碼 瀏覽:637
ps選擇命令大全 瀏覽:826
qq聊天記錄恢復文件夾 瀏覽:646
電腦公共盤加密碼 瀏覽:459
韓國電影兩個字 瀏覽:971
鴻蒙系統怎麼給App加速 瀏覽:190