當前位置:首頁 » 操作系統 » linux多播

linux多播

發布時間: 2022-05-01 16:14:08

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多播路由器設置如何生效

你好!linux多播路由器設置的簡介如下:
1、首先,接好無線路由器之後需要檢查是否通電,無線路由器是否正常亮燈運行。
2、檢查無誤後,打開瀏覽器輸入:192.168.1.1後按ENTER進入,這個時候彈出一個對話框,需要輸入帳戶名和密碼,這個不用操心,在路由器的後面會有的,你找著打上去就能登陸了,一般情況下都是:帳戶名:admin 密碼:admin
3、按照路由器背後的賬戶密碼輸入登錄後,就可以登陸到路由器的設置頁面了。
4、點擊頁面的設置向導,會出現一個帶領你設置好路由器的框框,按照它的要求一步步走下去。
5、點擊下一步,進入到賬號密碼設置,這個賬號密碼是你當前網路上網的賬號密碼,如果不知道,可以咨詢你的運營商。
6、設置好上網的賬號密碼之後就是無線上網的功能設置了,設置你的WIFI名稱和WIFI密碼,建議密碼不要設置過於簡單,容易被人破解,並且加密方式採用系統推薦就可以。
7、點擊完成,你的路由器設置已經成功了。

⑶ linux 套接字 多播怎麼編譯

1.概念
單播是用於兩個主機之間傳送數據,廣播是一個主機對區域網內的所有主機發送數據。而多播,又稱為組播,它是對一組特定的主機通信。將網路上同一類型 業務邏輯上分組,只和組內的成員通信,其它主機沒有加入組則不能通信。與單播相同的是,組播允許在Internet上通信,而廣播只是同一區域網內的主機 通信。組播地址是特定的,D類地址用於組播,即244.0.0.0到239.255.255.255. 並劃分為局部連接多播地址,預留多播地址和管理許可權多播地址3類。
(1)局部多播地址 (224.0.0.-224.0.0.255)為路由協議和其它用途保留的地址,路由器不轉發此范圍的IP包
(2)預留多播地址 (224.0.1.0-238.255.255.255)可用於全球范圍內或網路協議
(3)管理許可權的多播 (239.0.0.0-239.255.255.255) 可供組織內使用,類型於私有IP,不用於Internet,可限制多播范圍

2. 多播套接字設置
可用setsockopt或getsockopt設置或得到多播選項. 常用的多播選項如下所示:
IP_MULTICAST_TTL 設置多播的TTL值
IP_MULTICAST_IF 獲取或設置多播介面
IP_MULTICAST_LOOP 禁止多播數據回送到本地loop介面
IP_ADD_MEMBERSHIP 將指定的介面加入多播
IP_DROP_MEMBERSHIP 退出多播組
struct ip_mreq{
struct in_addr imn_multicastaddr;//多播組地址
struct in_addr imr_interface;//加入的介面的IP地址
}
int ttl=255;
setsockopt(s,IPPROTO_IP,IP_MULTICAST_TTL,&ttl,sizeof(ttl));//設置跳數
s-套接字描述符
PROTO_IP-選項所在的協議層
IP_MULTICAST_TTL-選項名
&ttl-設置的內存緩沖區
sizeof(ttl)-設置的內存緩沖區長度

struct in_addr in;
setsockopt(s,IPPROTO_IP,IP_MUTLICAST_IF,&in,sizeof(in));//設置組播介面

int yes=1;
setsockopt(s,IPPROTO_IP,IP_MULTICAST_LOOP,&yes,sizeof(yes));//設置數據回送到本地回環介面

struct ip_mreq addreq;
setsockopt(s,IPPROTO_IP,IP_ADD_MEMBERSHIP,&req,sizeof(req));//加入組播組

struct ip_mreq dropreq;
setsockopt(s,IPPROTO_IP,IP_DROP_MEMBERSHIP,&dropreq,sizeof(dropreq));//離開組播組

⑷ linux下配置多網卡組播地址,能正常使用,但重啟後顯示「no such device」,是什麼原因該怎麼解決

因為你用route命令添加的路由表不會保存到一次重啟,雖然你查看得到,你可以寫到啟動腳本里去。
編輯/etc/init.d/network,在未尾加上下面幾行:
# Add non interface-specific static-routes.
if [ -f /etc/sysconfig/static-routes ]; then
grep "^any" /etc/sysconfig/static-routes | while read ignore args ; do
/sbin/route add -$args
done
fi

編輯/etc/sysconfig/static-routes:
any net 224.0.0.101 netmask 255.255.255.255 dev eth0

any net 224.0.0.110 netmask 255.255.255.255 dev eth1
any net 244.0.0.111 netmask 255.255.255.255 dev eth3
any net 244.14.0.112 netmask 255.255.255.255 dev eth2

⑸ 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 內核 怎麼支持多播

應用程序通過命令字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裡面netstat -an命令作用是什麼

題主你好,

默認情況下,netstat只顯示處於已連接狀態的連接, 而加上-a參數後會顯示所有狀態的連接, 說白了就是加上-a參數顯示的內容要大於等於不加-a參數時顯示的內容, 你也可以簡單的理解為加上-a參數後顯示的條目更多了.

不加-a:


*.需要注意的是State列不只有ESTABLISHED和LISTEN這兩種狀態,還有其它狀態, 這里就不展開了,通過上面的描述,題主先簡單的理解一下,如果想要深入的理解netstat顯示的所有內容題主還需要學習tcp,udp等協議的細節.

*.一般用的最多的就是" netstat -an | grep 埠號 " 來看看該埠號是否已經被佔用了.

=====

希望可以幫到題主, 歡迎追問.

⑻ 如何在linux下打開組播功能

IGMP協議運行於主機和與主機直接相連的組播路由器之間,主機通過此協議告訴本地路由器希望加入並接受某個特定組播組的信息,同時路由器通過此協議周期性地查詢區域網內某個已知組的成員是否處於活動狀態(即該網段是否仍有屬於某個組播組的成員),實現所連網路組成員關系的收集與維護。IGMP有三個版本,IGMPv1由RFC1112定義,目前通用的是IGMPv2,由RFC2236定義。IGMPv3目前仍然是一個草案。IGMPv1中定義了基本的組成員查詢和報告過程,IGMPv2在此基礎上添加了組成員快速離開的機制,IGMPv3中增加的主要功能是成員可以指定接收或指定不接收某些組播源的報文。這里著重介紹IGMPv2協議的功能。
IGMPv2通過查詢器選舉機制為所連網段選舉唯一的查詢器。查詢器周期性的發送普遍組查詢消息進行成員關系查詢;主機發送報告消息來應答查詢。當要加入組播組時,主機不必等待查詢消息,主動發送報告消息。當要離開組播組時,主機發送離開組消息;收到離開組消息後,查詢器發送特定組查詢消息來確定是否所有組成員都已離開。
通過上述IGMP機制,在組播路由器里建立起一張表,其中包含路由器的各個埠以及在埠所對應的子網上都有哪些組的成員。當路由器接收到某個組G的數據報文後,只向那些有G的成員的埠上轉發數據報文。至於數據報文在路由器之間如何轉發則由路由協議決定,IGM

⑼ 怎樣用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中增加以下代碼,重啟後生效。作者:龍宇翔 苑慶國

熱點內容
魔獸世界退役伺服器有什麼用處 發布:2024-10-05 20:50:00 瀏覽:194
新車配置不符怎麼投訴 發布:2024-10-05 20:49:00 瀏覽:388
編譯的html文件 發布:2024-10-05 20:48:58 瀏覽:160
python自學網站 發布:2024-10-05 20:46:08 瀏覽:18
存儲在rom中的數據當計算機斷電後 發布:2024-10-05 20:43:46 瀏覽:9
炒股編程代碼 發布:2024-10-05 20:29:10 瀏覽:275
防火門報配置錯誤是什麼原因 發布:2024-10-05 20:20:47 瀏覽:886
移動寬頻設置路由器怎麼設置密碼 發布:2024-10-05 20:03:30 瀏覽:105
微指令的編譯方法有哪一些 發布:2024-10-05 19:02:10 瀏覽:886
android離線定位 發布:2024-10-05 18:36:40 瀏覽:860