新聞中心
如何實現(xiàn)Linux下的VLC的組播控制
vlc 命令行就能控制播放,你寫個程序運行這些命令就行了。
創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比隴南網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式隴南網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋隴南地區(qū)。費用合理售后完善,10多年實體公司更值得信賴。
我記得 vlc 也有這種控制軟件,你可以找找。
Linux常用性能診斷命令詳解
top命令動態(tài)地監(jiān)視進程活動與系統(tǒng)負載等信息。
使用示例:
效果如下圖:
以上命令輸出視圖中分為兩個區(qū)域,一個統(tǒng)計信息區(qū),一個進程信息區(qū)。
統(tǒng)計信息區(qū):
第一行信息依次為:系統(tǒng)時間、運行時間、登錄終端數(shù)、系統(tǒng)負載(三個數(shù)值分別為1分鐘、5分鐘、15分鐘內(nèi)的平均值,數(shù)值越小意味著負載越低)。
第二行信息依次為:進程總數(shù)、運行中的進程數(shù)、睡眠中的進程數(shù)、停止的進程數(shù)、僵死的進程數(shù)。
第三行信息依次為:用戶占用資源百分比、系統(tǒng)內(nèi)核占用資源百分比、改變過優(yōu)先級的進程資源百分比、空閑的資源百分比等。
第四行信息依次為:物理內(nèi)存總量、內(nèi)存使用量、內(nèi)存空閑量、作為內(nèi)核緩存的內(nèi)存量。
第五行信息依次為:虛擬內(nèi)存總量、虛擬內(nèi)存使用量、虛擬內(nèi)存空閑量、預(yù)加載內(nèi)存量。
進程信息區(qū):
按 q 鍵退出監(jiān)控頁面。
uptime 用于查看系統(tǒng)的負載信息。
使用示例:
查看系統(tǒng)的負載信息。
效果如下圖:
輸出說明:
當前服務(wù)器時間:11:06:57
當前服務(wù)器運行時長:59 min
當前用戶數(shù):1 users
當前負載情況:load average: 0.00, 0.04, 0.08(分別取1min,5min,15min的均值)
free用于顯示當前系統(tǒng)中內(nèi)存的使用量信息。
命令語法: free [-bkmotV][-s 間隔秒數(shù)]
參數(shù)說明:
使用示例:
顯示當前系統(tǒng)中內(nèi)存的使用量信息。
效果如下圖:
輸出說明:
ifconfig命令用于獲取網(wǎng)卡配置與網(wǎng)絡(luò)狀態(tài)等信息。
使用示例:
獲取網(wǎng)卡配置與網(wǎng)絡(luò)狀態(tài)等信息。
效果如下圖:
輸出說明:
第一部分的第一行顯示網(wǎng)卡狀態(tài)信息。
eth0表示第一塊網(wǎng)卡。
UP代表網(wǎng)卡開啟狀態(tài)。
RUNNING代表網(wǎng)卡的網(wǎng)線被接上。
MULTICAST表示支持組播。
第二行顯示網(wǎng)卡的網(wǎng)絡(luò)信息。
inet(IP地址):172.16.67.50。
netmask(掩碼地址):255.255.0.0。
broadcast(廣播地址):172.16.255.255。
RX表示接收數(shù)據(jù)包的情況,TX表示發(fā)送數(shù)據(jù)包的情況。
lo表示主機的回環(huán)網(wǎng)卡,是一種特殊的網(wǎng)絡(luò)接口,不與任何實際設(shè)備連接,而是完全由軟件實現(xiàn)。與回環(huán)地址(127.0.0.0/8 或 ::1/128)不同,回環(huán)網(wǎng)卡對系統(tǒng)顯示為一塊硬件。任何發(fā)送到該網(wǎng)卡上的數(shù)據(jù)都將立刻被同一網(wǎng)卡接收到。
如何在linux下打開組播功能
IGMP協(xié)議運行于主機和與主機直接相連的組播路由器之間,主機通過此協(xié)議告訴本地路由器希望加入并接受某個特定組播組的信息,同時路由器通過此協(xié)議周期性地查詢局域網(wǎng)內(nèi)某個已知組的成員是否處于活動狀態(tài)(即該網(wǎng)段是否仍有屬于某個組播組的成員),實現(xiàn)所連網(wǎng)絡(luò)組成員關(guān)系的收集與維護。IGMP有三個版本,IGMPv1由RFC1112定義,目前通用的是IGMPv2,由RFC2236定義。IGMPv3目前仍然是一個草案。IGMPv1中定義了基本的組成員查詢和報告過程,IGMPv2在此基礎(chǔ)上添加了組成員快速離開的機制,IGMPv3中增加的主要功能是成員可以指定接收或指定不接收某些組播源的報文。這里著重介紹IGMPv2協(xié)議的功能。
IGMPv2通過查詢器選舉機制為所連網(wǎng)段選舉唯一的查詢器。查詢器周期性的發(fā)送普遍組查詢消息進行成員關(guān)系查詢;主機發(fā)送報告消息來應(yīng)答查詢。當要加入組播組時,主機不必等待查詢消息,主動發(fā)送報告消息。當要離開組播組時,主機發(fā)送離開組消息;收到離開組消息后,查詢器發(fā)送特定組查詢消息來確定是否所有組成員都已離開。
通過上述IGMP機制,在組播路由器里建立起一張表,其中包含路由器的各個端口以及在端口所對應(yīng)的子網(wǎng)上都有哪些組的成員。當路由器接收到某個組G的數(shù)據(jù)報文后,只向那些有G的成員的端口上轉(zhuǎn)發(fā)數(shù)據(jù)報文。至于數(shù)據(jù)報文在路由器之間如何轉(zhuǎn)發(fā)則由路由協(xié)議決定,IGM
怎樣用Linux實現(xiàn)組播路由轉(zhuǎn)發(fā)
這就要有PIM(Protocol Independent Multicast,協(xié)議無關(guān)組播組)協(xié)議的支持,就必須在Linux環(huán)境下安裝Pimd軟件協(xié)議包。 安裝補丁文件 安裝Pimd軟件協(xié)議包需要兩個補丁文件:pimkern-freebsd-4.6.patch和netstat-freebsd-4.6.patch。安裝步驟如下: 首先將兩個補丁文件拷貝到/usr/src/目錄下,并執(zhí)行以下命令:#patch -p2 netstat-freebsd-4.6.patch #patch -p2 pimkern-freebsd-4.6.patch 執(zhí)行以下命令,編譯并安裝netstat:#cd /usr/src/usr.bin/netstat #make #make install 重新編譯內(nèi)核 執(zhí)行以下命令,修改multi配置文件:#cd /usr/src/sys/i386/conf/ #cp GENRIC multi #vi multi 在multi配置文件中,加入下列兩行代碼:options MROUTING options PIM 保存并退出vi編輯器。 在當前multi配置文件所在的目錄執(zhí)行以下命令:#config multi #cd /usr/src/sys/compile/multi/ #make depend #make #make install 至此,新內(nèi)核編譯完畢。 備份Kernel文件 新內(nèi)核編譯完畢后,在重新啟動前,要先將根目錄下原有的Kernel文件進行備份。#cd / #mv kernel kernel.old 若提示“operation not permitted”,則需要先執(zhí)行以下命令:#chflags noschg /kernel 備份Kernel文件后執(zhí)行以下命令:#cp /usr/src/sys/compile/multi/kernel /kernel 在系統(tǒng)重新啟動后,默認選擇的便是新編譯的內(nèi)核。 安裝Pimd軟件協(xié)議包 Linux下Pimd軟件協(xié)議包代碼的起源有兩個地方,一個是日本的KAME項目組,另一個是南加州大學信息科學學院。到這兩個組織的主頁上都可以下載所需要的pimd-current.tar.gz 協(xié)議包和上面提到的兩個補丁。 用以下命令解壓縮 pimd-current.tar.gz 軟件包,并安裝:#tar zxf pimd-current.tar.gz #cd pimd-2.1.0-alpha29.16 #make #make install 以上命令執(zhí)行過程中可能會出現(xiàn)錯誤,需要手工將其完成,拷貝當前目錄下的pimd文件:#cp pimd /usr/local/bin/ #chmod 755 pimd #cp pimd.conf /etc/ 至此,Pimd軟件協(xié)議包安裝完畢。還需要打開Linux系統(tǒng)的路由轉(zhuǎn)發(fā)功能,才能實現(xiàn)組播包的轉(zhuǎn)發(fā),即在配置文件rc.conf中增加以下代碼,重啟后生效。作者:龍宇翔 苑慶國
Linux上,一個套接字如何加入不同的組播?能否提供一個小程序?
1.TCP流式套接字的編程步驟
在使用之前須鏈接庫函數(shù):工程-設(shè)置-Link-輸入ws2_32.lib,OK!
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);//創(chuàng)建套接字(socket)。
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//轉(zhuǎn)換Unsigned short為網(wǎng)絡(luò)字節(jié)序的格式
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
客戶端代碼如下:
#include Winsock2.h
#include stdio.h
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, wsaData );加載套接字庫
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup()( );
return;
}
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);創(chuàng)建套接字(socket)。
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
connect(sockClient,(SOCKADDR*)addrSrv,sizeof(SOCKADDR));向服務(wù)器發(fā)出連接請求(connect)。
char recvBuf[100];和服務(wù)器端進行通信(send/recv)。
recv(sockClient,recvBuf,100,0);
printf("%s\n",recvBuf);
send(sockClient,"This is lisi",strlen("This is lisi")+1,0);
closesocket(sockClient);關(guān)閉套接字。
WSACleanup()();//必須調(diào)用這個函數(shù)清除參數(shù)
}
linux 怎樣加入一個多播組
應(yīng)用程序通過命令字IP_ADD_MEMBERSHIP把一個socket加入到一個多播組,IP_ADD_MEMBERSHIP是一個IP層的命令字,其調(diào)用使用的參數(shù)是結(jié)構(gòu)體struct ip_mreq,其定義如下:
struct ip_mreq
{
struct in_addr imr_multiaddr;
struct in_addr imr_interface;
};
該結(jié)構(gòu)體的兩個成員分別用于指定所加入的多播組的組IP地址,和所要加入組的那個本地接口的IP地址。該命令字沒有源過濾的功能,它相當于實現(xiàn)IGMPv1的多播加入服務(wù)接口。
ip_setsockopt實現(xiàn)了該命令字,它通過調(diào)用ip_mc_join_group把socket加入到多播組。
表示socket的結(jié)構(gòu)體struct inet_sock有一個成員mc_list,它是一個結(jié)構(gòu)體struct ip_mc_socklist的指針,實際上一個該結(jié)構(gòu)體的鏈表,該結(jié)構(gòu)體的定義如下:
struct ip_mc_socklist
{
struct ip_mc_socklist *next;
struct ip_mreqn multi;
unsigned int sfmode;
struct ip_sf_socklist *sflist;
};
next指向鏈表的下一個節(jié)點;multi表示組信息,即在哪一個本地接口上,加入到哪一個多播組;sfmode是過濾模式,取值為
MCAST_INCLUDE或MCAST_EXCLUDE,分別表示只接收sflist所列出的那些源的多播數(shù)據(jù)報,和不接收sflist所列出的那些源
的多播數(shù)據(jù)報;sflist是源列表,結(jié)構(gòu)體struct ip_sf_socklist的定義如下:
struct ip_sf_socklist
{
unsigned int sl_max;
unsigned int sl_count;
__u32 sl_addr[0];
};
sl_addr是源地址列表,sl_count應(yīng)該是源地址列表中源地址的數(shù)量,sl_max應(yīng)該是當前sl_addr數(shù)組的最大可容納量(不確定)。對
于通過調(diào)用IP_ADD_MEMBERSHIP加入的多播組,它會在struct inet_sock的mc_list的鏈表頭添加如下一個節(jié)點:
struct ip_mc_socklist{
.next = 原來的鏈表頭;
.multi = 所加入的多播組,和接口信息;
.sfmode = MCAST_EXCLUDE;
.sflist = NULL; 即不排除任何源地址,也就是不存在源過濾。
}
另外,一個socket所允許加入的多播組的最大數(shù)量也是有限制的,mc_list中節(jié)點的數(shù)量不允許超過sysctl_igmp_max_memberships(缺省為20)。
ip_mc_join_group還需要通過ip_mreq.imr_interface的指定值找到要加入多播組的那個接口,并為接口設(shè)置狀態(tài)(即該接
口要加入哪個多播組,過濾哪些源,也就是為該接口增加一個組,如果要增加的組已存在,則增加該組的引用計數(shù))。代表網(wǎng)絡(luò)設(shè)備接口的結(jié)構(gòu)體struct
in_device有一個成員mc_list,這是一個結(jié)構(gòu)體struct ip_mc_list的鏈表,該結(jié)構(gòu)體的定義如下:
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指向網(wǎng)絡(luò)設(shè)備接口,multicast即為加入的組的多播地址,users記錄當前有幾個socket在該接口上加入了該多播組。
sfcount是一個有兩個元素的數(shù)組,分別記錄在該接口上加入多播組的socket的過濾模式為EXCLUDE和INCLUDE的數(shù)量,sfmode為
該接口本身的過濾模式。sources為源地址列表,該結(jié)構(gòu)體具體內(nèi)容稍后再分析。timer為主動報告定時器,當一個接口(注意:不是socket)新
加入到一個多播組,需要向多播路由器發(fā)送一個igmp報告,以通知多播路由器需要向本地網(wǎng)絡(luò)轉(zhuǎn)發(fā)該組的數(shù)據(jù)報。tm_running是一個標志,如果
timer當前正在運行,則置1,否則置0。reporter也是一個標志,如果當前正要開始發(fā)送igmp報告,則置該標志為1,否則為0。
unsolicit_count是當一個接口新加入到一個多播組時,發(fā)送主動報告的次數(shù),值賦為
IGMP_Unsolicited_Report_Count(缺省值為2)。loaded也是一個標志,當該接口上的該多播組被加入時,需要通知硬件過
濾器,通知完成即置該標志為1,否則為0。
該結(jié)構(gòu)體比較復(fù)雜,先看通過IP_ADD_MEMBERSHIP命令字把一個socket加入到一個新的多播組,會使struct in_device的mc_list中增加一個什么樣的節(jié)點。下面是生成的節(jié)點的情況:
struct ip_mc_list{
.interface = in_dev;
.multiaddr = 多播組地址;
.source = NULL; //源過濾列表為空。
.tomb = NULL;
.sfmode = MCAST_EXCLUDE; //EXCLUDE模式,即不過濾任何源。
.sfcount[MCAST_EXCLUDE] = 1;
.sfcount[MCAST_INCLUDE] = 0;//即該節(jié)點上該多播組有一個socket加入,過濾模式為EXCLUDE。
.users = 1; //有一個用戶。
.refcnt = 1; //引用計數(shù)為1
.tm_running = 0;
.unsolicit_count = 2;
... ...
}
新生成的節(jié)點加入到mc_list鏈表中后,要通知網(wǎng)絡(luò)設(shè)備接口的硬件,以使它的過濾機制可以接收進該多播組的數(shù)據(jù)報,同時也要通知多播路由器。
首先要把多播地址映射成以太網(wǎng)地址,映射規(guī)則是把多播IP地址的低23位放到以太網(wǎng)多播地址01-00-5E-00-00-00(16進制)的低23位。
因為一個IP組地址有28位有效位(除去高位的1110),所以有可能出現(xiàn)多個組地址被映射成同一個以太網(wǎng)多播地址,具體實現(xiàn)見
ip_eth_mc_map。然后把這個mac地址加到硬件的過濾機制中。
具體的實現(xiàn)在函數(shù)dev_mc_add中。代表網(wǎng)絡(luò)設(shè)備接口的結(jié)構(gòu)體struct net_device也有一個成員mc_list,它是一個結(jié)構(gòu)體struct dev_mc_list的鏈表,該結(jié)構(gòu)體的定義如下:
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指向鏈表下一個節(jié)點,dmi_addr是多播mac地址,dmi_addrlen為多播mac地址的長度,dmi_users是在節(jié)點被重復(fù)到加
入到設(shè)備上的次數(shù),struct
net_device還有一個成員mc_count,用于記錄鏈表中節(jié)點的數(shù)量。dev_mc_add創(chuàng)建一個新的struct
dev_mc_list節(jié)點,加入到鏈表中,并通過調(diào)用網(wǎng)絡(luò)設(shè)備接口的成員函數(shù)set_multicast_list來啟用設(shè)備的過濾機制。
最后一步發(fā)送主動成員報告,這里,首先忽略IGMPv1和IGMPv2存在的情況。如果要加入的多播組是
IGMP_ALL_HOSTS(224.0.0.1),則不需要發(fā)送成員報告。否則啟用定時器struct
in_device-mr_ifc_timer(接口狀態(tài)改變定時器),該定時器在設(shè)備初始化的時候被建立,其超時處理函數(shù)是
igmp_ifc_timer_expire,它發(fā)送一個IGMPv3的報告,然后再次啟用定時器。也就是說,第一個主動成員報告立即發(fā)出,然后在一個0
到IGMP_Unsolicited_Report_Interval(缺省為10秒)之間的一個時間后,發(fā)出第二個主動成員報告,連續(xù)發(fā)出
IGMP_Unsolicited_Report_Count(缺省值為2)個。
測試環(huán)境中要加入的多播組是224.0.1.1,發(fā)出的IGMPv3報告如下:
數(shù)據(jù) 含義
22 第3版成員關(guān)系報告
00 8bit保留,必須為0
f8 fc 校驗和
00 00 16bit保留,必須為0
00 01 組記錄的數(shù)量,為1
下面為一條組記錄:
04 類型為CHANGE_TO_EXCLUDE_MODE,改變到EXCLUDE過濾模式
00 輔助數(shù)據(jù)長度
00 00 源地址的數(shù)量
e0 00 01 01 組地址224.0.1.1
文章題目:Linux命令發(fā)組播,linux加入組播
瀏覽路徑:http://biofuelwatch.net/article/hogssg.html