組播編程
『壹』 在進行UDP組播編程時,主機不能退出組播網,是怎麼回事
zhshdxhxhztvghnztdyda
『貳』 求「能夠用NS模擬的組播擁塞控制演算法」源代碼
NS是一種針對網路技術的源代碼公開的、免費的軟體模擬平台,研究人員使用它可以很容易的進行網路技術的開發,而且發展到今天,它所包含的模塊已經非常豐富,幾乎涉及到了網路技術的所有方面。所以,NS成了目前學術界廣泛使用的一種網路模擬軟體。在每年國內外發表的有關網路技術的學術論文中,利用NS給出模擬結果的文章最多,通過這種方法得出的研究結果也是被學術界所普遍認可的,此外,NS也可作為一種輔助教學的工具,已被廣泛應用在了網路技術的教學方面。因此,目前在學術界和教育界,有大量的人正在使用或試圖使用NS。
然而,對初學者來說,NS是非常難於掌握的,一般人從學習NS到上手至少需要半年多時間。原因是多方面的:一方面,NS內容龐雜,隨軟體所提供的手冊更新不夠快,初學者閱讀起來非常困難;另一方面,使用NS還要掌握其它很多必備的相關知識以及相關工具,這會使初學者感到無從入手;有的使用者可能還不了解網路模擬的過程或是對NS軟體的機制缺乏理解,這也影響了對NS的掌握。另外,不論在國外還是國內,還沒有一本書能集中回答和解決這些問題,這也是NS難於被掌握的一個重要原因。
1、NS2簡介
NS2(Network Simulator, version 2)是一種面向對象的網路模擬器,本質上是一個離散事件模擬器。由UC Berkeley開發而成。它本身有一個虛擬時鍾,所有的模擬都由離散事件驅動的。目前NS2可以用於模擬各種不同的IP網,已經實現的一些模擬有:網路傳輸協議,比如TCP和UDP;業務源流量產生器,比如FTP, Telnet, Web CBR和VBR;路由隊列管理機制,比如Droptail , RED和CBQ;路由演算法,比如Dijkstra等。NS2也為進行區域網的模擬而實現了多播以及一些MAC 子層協議。
NS2使用C++和Otcl作為開發語言。NS可以說是Otcl的腳本解釋器,它包含模擬事件調度器、網路組件對象庫以及網路構建模型庫等。事件調度器計算模擬時間,並且激活事件隊列中的當前事件,執行一些相關的事件,網路組件通過傳遞分組來相互通信,但這並不耗費模擬時間。所有需要花費模擬時間來處理分組的網路組件都必須要使用事件調度器。它先為這個分組發出一個事件,然後等待這個事件被調度回來之後,才能做下一步的處理工作。事件調度器的另一個用處就是計時。NS是用Otcl和C++編寫的。由於效率的原因,NS將數據通道和控制通道的實現相分離。為了減少分組和事件的處理時間,事件調度器和數據通道上的基本網路組件對象都使用C++寫出並編譯的,這些對象通過映射對Otcl解釋器可見。
當模擬完成以後,NS將會產生一個或多個基於文本的跟蹤文件。只要在Tcl腳本中加入一些簡單的語句,這些文件中就會包含詳細的跟蹤信息。這些數據可以用於下一步的分析處理,也可以使用NAM將整個模擬過程展示出來。
2、使用NS進行網路模擬的方法和一般過程。
進行網路模擬前,首先分析模擬涉及哪個層次,NS模擬分兩個層次:一個是基於OTcl編程的層次。利用NS已有的網路元素實現模擬,無需修改NS本身,只需編寫OTcl腳本。另一個是基於C++和OTcl編程的層次。如果NS中沒有所需的網路元素,則需要對NS進行擴展,添加所需網路元素,即添加新的C++和OTcl類,編寫新的OTcl腳本。
假設用戶已經完成了對NS的擴展,或者NS所包含的構件已經滿足了要求,那麼進行一次模擬的步驟大致如下:
(1)開始編寫OTcl腳本。首先配置模擬網路拓撲結構,此時可以確定鏈路的基本特性,如延遲、帶寬和丟失策略等。
(2)建立協議代理,包括端設備的協議綁定和通信業務量模型的建立。
(3)配置業務量模型的參數,從而確定網路上的業務量分布。
(4)設置Trace對象。NS通過Trace文件來保存整個模擬過程。模擬完後,用戶可以對Trace文件進行分析研究。
(5)編寫其他的輔助過程,設定模擬結束時間,至此OTcl腳本編寫完成。
(6)用NS解釋執行剛才編寫的OTcl腳本。
(7)對Trace文件進行分析,得出有用的數據。
(8)調整配置拓撲結構和業務量模型,重新進行上述模擬過程。
NS2採用兩級體系結構,為了提高代碼的執行效率,NS2 將數據操作與控制部分的實現相分離,事件調度器和大部分基本的網路組件對象後台使用C++實現和編譯,稱為編譯層,主要功能是實現對數據包的處理;NS2的前端是一個OTcl 解釋器,稱為解釋層,主要功能是對模擬環境的配置、建立。從用戶角度看,NS2 是一個具有模擬事件驅動、網路構件對象庫和網路配置模塊庫的OTcl腳本解釋器。NS2中編譯類對象通過OTcl連接建立了與之對應的解釋類對象,這樣用戶間能夠方便地對C++對象的函數進行修改與配置,充分體現了模擬器的一致性和靈活性。
3、NS2的功能模塊
NS2模擬器封裝了許多功能模塊,最基本的是節點、鏈路、代理、數據包格式等等,下面分別來介紹一下各個模塊。
(1)事件調度器:目前NS2提供了四種具有不同數據結構的調度器,分別是鏈表、堆、日歷表和實時調度器。
(2)節點(node):是由TclObject對象組成的復合組件,在NS2中可以表示端節點和路由器。
(3)鏈路(link):由多個組件復合而成,用來連接網路節點。所有的鏈路都是以隊列的形式來管理分組的到達、離開和丟棄。
(4)代理(agent):負責網路層分組的產生和接收,也可以用在各個層次的協議實現中。每個agent連接到一個網路節點上,由該節點給它分配一個埠號。
(5)包(packet):由頭部和數據兩部分組成。一般情況下,packet只有頭部、沒有數據部分。
4、NS2的軟體構成
NS2包含Tcl/Tk, OTcl, NS,Tclcl。其中Tcl是一個開放腳本語言,用來對NS2進行編程;Tk是Tcl的圖形界面開發工具,可幫助用戶在圖形環境下開發圖形界面;OTcl是基於Tcl/Tk的面向對象擴展,有自己的類層次結構;NS2為本軟體包的核心,是面向對象的模擬器,用C++編寫,以OTcl解釋器作為前端;Tclcl則提供NS2和OTcl的介面,使對象和變數出現在兩種語言中。為了直觀的觀察和分析模擬結果,NS2 提供了可選的Xgraphy、可選件Nam。
5、NS現有的模擬元素
從網路拓撲模擬、協議模擬和通信量模擬等方面介紹NS的相應元素:
(1)網路拓撲主要包括節點、鏈路。NS的節點由一系列的分類器(Classifier,如地址分類器等)組成,而鏈路由一系列的連接器(Connector)組成。
(2)在節點上,配置不同的代理可以實現相應的協議或其它模型模擬。如NS的TCP代理,發送代理有:TCP,TCP/Reno,TCP/Vegas,TCP/Sack1,TCP/FACK,TCP/FULLTCP等,接收代理有:TCPSINK,TCPSINK/DELACK。TCPSINK/SACK1,TCPSINK/SACK1/DELACK等。此外,還提供有UDP代理及接收代理Null(負責通信量接收)、Loss Monitor(通信量接收並維護一些接收數據的統計)。
(3)網路的路由配置通過對節點附加路由協議而實現。NS中有三種單播路由策略:靜態、會話、動態。
(4)在鏈路上,可以配置帶寬、時延和丟棄模型。NS支持:Drop-tail(FIFO)隊列、RED緩沖管、CBO(包括優先權和Round-robin 調度)。各種公平隊列包括:FQ,SFQ,DRR等。
(5)通信量模擬方面,NS提供了許多通信應用,如FTP,它產生較大的峰值數據傳輸;Telnet則根據相應文件隨機選取傳輸數據的大小。此外,NS提供了四種類型的通信量產生器:EXPOO,根據指數分布(On/Off)產生通信量,在On階段分組以固定速率發送,Off階段不發送分組,On/Off的分布符合指數分布,分組尺寸固定;POO,根據Pareto分布(On/Off)產生通信量,它能用來產生長范圍相關的急劇通信量;CBR,以確定的速率產生通信量,分組尺寸固定,可在分組間隔之間產生隨機抖動;Traffic Trace,根據追蹤文件產生通信量。
『叄』 請問下寫 網路編程的時候中的組播 調用setsockopt錯誤返回 10055 ~ 然後提示資源不夠用, 或者緩沖隊列滿
WSAENOBUFS (10055) No buffer space available.
由於系統缺乏足夠的緩沖區空間,或因為隊列已滿,在套接字上的操作無法執行。
你嘗試著將緩沖器空間設置大一點,
// 接收緩沖區
int nRecvBuf=32*1024;//設置為32K
setsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));
//發送緩沖區
int nSendBuf=32*1024;//設置為32K
setsockopt(s,SOL_SOCKET,SO_SNDBUF,(const char*)&nSendBuf,sizeof(int));
『肆』 Linux上,一個套接字如何加入不同的組播能否提供一個小程序
1.TCP流式套接字的編程步驟
在使用之前須鏈接庫函數:工程->設置->Link->輸入ws2_32.lib,OK!
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);//創建套接字(socket)。
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//轉換Unsigned short為網路位元組序的格式
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);創建套接字(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));向伺服器發出連接請求(connect)。
char recvBuf[100];和伺服器端進行通信(send/recv)。
recv(sockClient,recvBuf,100,0);
printf("%s\n",recvBuf);
send(sockClient,"This is lisi",strlen("This is lisi")+1,0);
closesocket(sockClient);關閉套接字。
WSACleanup()();//必須調用這個函數清除參數
}
『伍』 一個組播編程的例子以及組播和廣播的區別
你首先要明白組播和廣播的定義:
組播(multicasting)是一種多點投遞的形式,它使用硬體技術,通過使用大量組播地址來通信.當某一組機器需要通信時,選擇一個組播地址,並配置好相應的網路介面硬體,識別組播地址,從而收到該組播地址上分組的拷貝.
廣播(broadcasting)是多點投遞的最普遍的形式,它向每一個目的站投遞一個分組的拷貝.它可以通過多個單次分組的投遞完成,也可以通過單獨的連接傳遞分組的拷貝,直到每個接收方均收到一個拷貝為止.
舉個例子:縣里開大會,只同時通知了A村、B村、C村參加就是組播;同時通知了所有的村子參加就是廣播了!
『陸』 給幾道編程題目吧!!(c++)難度不要太低
1.給點一個圖,判定它是否是歐拉圖,然後找出歐拉圈。
2.給定一個圖,判斷它是否是哈密頓圖,然後找出哈密頓圈。
3.實現python中的大數運算。
4.將外存儲器中的一個文件包2^32個int型數,至少找出一對重復的數。
5.寫一個組播的路由演算法。
6.寫一個操作系統內核
7.構造一個編譯器
8.寫一個可以分區,修改MBR,格式化分區的工具箱。
9.給我的路由器,寫一個ipv6轉發模塊
10.部署一個完整的應用:內核,中間件,編程語言支持,應用框架。
11.破解RSA
。。。
『柒』 多播的網路通信中的多播
IP多播(也稱多址廣播或組播)技術,是一種允許一台或多台主機(多播源)發送單一數據包到多台主機(一次的,同時的)的TCP/IP網路技術。多播作為一點對多點的通信,是節省網路帶寬的有效方法之一。在網路音頻/視頻廣播的應用中,當需要將一個節點的信號傳送到多個節點時,無論是採用重復點對點通信方式,還是採用廣播方式,都會嚴重浪費網路帶寬,只有多播才是最好的選擇。多播能使一個或多個多播源只把數據包發送給特定的多播組,而只有加入該多播組的主機才能接收到數據包。目前,IP多播技術被廣泛應用在網路音頻/視頻廣播、AOD/VOD、網路視頻會議、多媒體遠程教育、「push」技術(如股票行情等)和虛擬現實游戲等方面。
有些應用會有這樣的要求:一些分布在各處的進程需要以組的方式協同工作,組中的進程通常要給其他所有的成員發送消息。即有這樣的一種方法能夠給一些明確定義的組發送消息,這些組的成員數量雖然很多,但是與整個網路規模相比卻很小。給這樣一個組發送消息稱為多點點播送,簡稱多播。
一、IP多播技術簡介
1.IP多播地址和多播組
IP多播通信必須依賴於IP多播地址,在IPv4中它是一個D類IP地址,范圍從224.0.0.0到239.255.255.255,並被劃分為局部鏈接多播地址、預留多播地址和管理許可權多播地址三類。其中,局部鏈接多播地址范圍在224.0.0.0~224.0.0.255,這是為路由協議和其它用途保留的地址,路由器並不轉發屬於此范圍的IP包;預留多播地址為224.0.1.0~238.255.255.255,可用於全球范圍(如Internet)或網路協議;管理許可權多播地址為239.0.0.0~239.255.255.255,可供組織內部使用,類似於私有IP地址,不能用於Internet,可限制多播范圍。
使用同一個IP多播地址接收多播數據包的所有主機構成了一個主機組,也稱為多播組。一個多播組的成員是隨時變動的,一台主機可以隨時加入或離開多播組,多播組成員的數目和所在的地理位置也不受限制,一台主機也可以屬於幾個多播組。此外,不屬於某一個多播組的主機也可以向該多播組發送數據包。
2.IP多播技術的硬體支持
要實現IP多播通信,要求介於多播源和接收者之間的路由器、集線器、交換機以及主機均需支持IP多播。目前,IP多播技術已得到硬體、軟體廠商的廣泛支持。
(1)主機
支持IP多播通信的平台包括Windows CE 2.1、Windows 95、Windows 98、Windows NT 4和Windows 2000等,運行這些操作系統的主機都可以進行IP多播通信。此外,新生產的網卡也幾乎都提供了對IP多播的支持。
(2)集線器和交換機
目前大多數集線器、交換機只是簡單地把多播數據當成廣播來發送接收,但一些中、高檔交換機提供了對IP多播的支持。例如,在3COM SuperStack 3 Swith 3300交換機上可啟用802.1p或IGMP多播過濾功能,只為已偵測到IGMP數據包的埠轉發多播數據包。
(3)路由器
多播通信要求多播源節點和目的節點之間的所有路由器必須提供對Internet組管理協議(IGMP)、多播路由協議(如PIM、DVMRP等)的支持。
當一台主機欲加入某個多播組時,會發出「主機成員報告」的IGMP消息通知多播路由器。當多播路由器接收到發給那個多播組的數據時,便會將其轉發給所有的多播主機。多播路由器還會周期性地發出「主機成員查詢」的IGMP消息,向子網查詢多播主機,若發現某個多播組已沒有任何成員,則停止轉發該多播組的數據。此外,當支持IGMP v2的主機(如Windows 98/2000計算機)退出某個多播組時,還會向路由器發送一條「離開組」的IGMP消息,以通知路由器停止轉發該多播組的數據。但只有當子網上所有主機都退出某個多播組時,路由器才會停止向該子網轉發該多播組的數據。
使用多播路由協議,路由器可建立起從多播源節點到所有目的節點的多播路由表,從而實現在子網間轉發多播數據包。例如,PIM(協議獨立多播)就是一種多播路由協議,它有兩種類型:稀疏模式(sparse-mode)和密集模式(dense-mode)。以Cisco 2621路由器為例,啟用IP多播轉發功能的基本設置如下:
c2621(config)# ip multicast-routing 啟動IP多播,使路由器成為一個多播路由器
c2621(config)# int f0/0 配置快速乙太網埠0
c2621(config-if)# ip pim dense-mode(或sparse-mode)啟動PIM,同時激活IGMP協議
c2621(config-if)# int f0/1 配置快速乙太網埠1
c2621(config-if)# ip pim dense-mode(或sparse-mode)
二、IP多播應用的編程方法
在實際應用中,編程人員通常需要自己編制底層網路應用程序來實現網上的底層通信,如具體實現IP多播通信的功能。編制底層網路應用程序通常要藉助於網路數據通信編程介面,而在不同的操作系統中所提供的網路編程介面是有所不同的,如在Microsoft Windows環境下的網路編程介面就是Windows套接字(Windows Socket,簡稱Winsock)。
Winsock提供了包括TCP/IP、IPX等多種通信協議下的編程介面。不同的Windows版本支持不同的Winsock版本,其中Windows 95等早期版本本身只支持Winsock1.1(16位)下的編程(可以通過安裝相關的軟體包使其支持Winsock2.0),而Windows98、Windows NT4.0、Windows 2000則直接支持Winsock2.0(32位)。Winsock2.0是Winsock1.1的擴展,除兼容Winsock1.1 API外,還定義了一套可支持IP多播的與協議無關的API。
使用Winsock 2.0實現IP多播的一般步驟如下:
1.初始化Winsock資源
在使用Winsock之前,必須調用WSAStartup()函數初始化Windows Sockets DLL。它允許應用程序或DLL指定Windows Sockets API要求的版本。
2.創建套接字
調用WSASocket()函數可以創建一個使用UDP協議的套接字,它是加入多播組的初始化套接字,並且以後數據的發送和接收都在該套接字上進行。針對IP多播通信,可將參數dwFlags設置為WSA_FLAG_MULTIPOINT_C_LEAF、WSA_FLAG_MULTIPOINT_D_LEAF和WSA_FLAG_OVERLAPPED的位和,指明IP多播通信在控制層面和數據層面都是「無根的」,只存在葉節點,它們可以任意加入一個多播組,而且從一個葉節點發送的數據會傳送到每一個葉節點(包括它自己);創建的套接字具有重疊屬性。
3.設置套接字的選項
調用setsockopt()函數為套接字設置SO_REUSEADDR選項,以允許套接字綁扎到一個已在使用的地址上。
4.綁定套接字
調用bind()函數綁定套接字,從而將創建好的套接字與本地地址和本地埠聯系起來。對於多播通信來說,發送和接收數據通常採用同一個埠。
5.設置多播套接字的模式
WSAIoctl()函數的命令碼SIO_MULTICAST_LOOP用來允許或禁止多播通信時發送出去的通信流量是否也能夠在同一個套接字上被接收(即多播返回)。值得注意的是,在Windows 95/98/NT 4中,默認是允許多播返回,但不能設置禁止,否則會出錯;只有在Windows 2000以上版本中,才能設置允許/禁止多播返回。
WSAIoctl()函數的命令碼SIO_MULTICAST_SCOPE用來設置多播傳播的范圍,即生存時間TTL。每當多播路由器轉發多播數據包時,數據包中的TTL值都會被減1,若數據包的TTL減少到0,則路由器將拋棄該數據包。TTL的值是多少,多播數據便最多能經過多少個多播路由器。例如,TTL值為0,則多播只能在本地主機的多個套接字間傳播,而不能傳播到「網線」上;TTL值為1(默認值),則多播數據遇到第一個路由器,便會被它「無情」地丟棄,不允許傳出本地網路之外,即只有同一個網路內的多播組成員才能收到多播數據。
c#中的多播
在c#中一般的代理實例(指一個代理僅可以調用一個方法)被默認為Delegate類的對象,所以通常使用delegate關鍵字來定義代理,利用new運算符來創建代理實例,然後使用Delegate類的方法和屬性管理代理實例。
而MulticastDelegate類是用來支持多重代理的,其調用列表中可以擁有多個方法的代理。
多重代理是指將一組代理組成一個集合,由MuticastDelegate類的一個對象來管理這個代理集合,利用這個代理集合執行多個方法,這個功能叫多播。
『捌』 大學J2ME作業,求高手指點迷津!!!感激不敬
指點迷津的話·· 這就很簡單了··· 這個是客戶端請求伺服器端數據的代碼·· 僅僅指點~
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;
import com.ctai.communication.downlink.HTTP_DownFather;
import com.ctai.utils.ConnectionAgent;
import com.ctai.utils.DefaultProperties;
public class HTTP_Down_Help implements Runnable
{
private DataInputStream dis;
private String st_lowUrl = "";
public boolean isOK = true;
private HTTP_DownFather hdf = null;
private HttpConnection conn = null;
private InputStream is = null;
public void getMessage(String url) throws IOException
{
/** 真實環境 */
ConnectionAgent ca = ConnectionAgent.getInstance();
ca.checkConnection(DefaultProperties.st_url, "zknx.aspx");
conn = ca.createConnection(DefaultProperties.st_url, url);
/** 電腦本地測試用 */
// conn = (HttpConnection)Connector.open(DefaultProperties.st_url + "/" + url);
// conn.setRequestMethod(HttpConnection.GET);
// conn.setRequestProperty("content-type", "text/html;charset=gb2312");
}
public void run()
{
hdf.down();
HTTP_DownFather.str_message = "";
try
{
byte b[] = null;
getMessage(st_lowUrl);
is = conn.openInputStream();
b = new byte[is.available()];
is.read(b, 0, b.length);
HTTP_DownFather.str_message = new String(b, "utf_8");
}
catch (Exception e)
{
hdf.error();
hdf.end();
}
finally
{
try
{
if( is != null)
{
is.close();
}
if(conn!= null)
{
conn.close();
}
if (dis!= null )
{
dis.close();
}
}
catch (IOException e)
{
hdf.error();
hdf.end();
}
}
if(HTTP_DownFather.str_message.equals("error"))
{
hdf.error();
hdf.end();
}
else if(HTTP_DownFather.str_message.equals("wgx"))
{
hdf.noNew();
}
else
{
if(HTTP_DownFather.str_message.equals(""))
{
hdf.InputStreamError();
}
else
{
hdf.writeCard();
}
}
hdf.end();
}
public void start()
{
new Thread(this).start();
}
public void init(String st_lowUrl, HTTP_DownFather httpDownFather)
{
hdf = httpDownFather;
this.st_lowUrl = st_lowUrl;
}
}
『玖』 Python下怎麼搞組播編程
你首先要明白組播和廣播的定義:
組播(multicasting)是一種多點投遞的形式,它使用硬體技術,通過使用大量組播地址來通信.當某一組機器需要通信時,選擇一個組播地址,並配置好相應的網路介面硬體,識別組播地址,從而收到該組播地址上分組的拷貝.
廣播(broadcasting)是多點投遞的最普遍的形式,它向每一個目的站投遞一個分組的拷貝.它可以通過多個單次分組的投遞完成,也可以通過單獨的連接傳遞分組的拷貝,直到每個接收方均收到一個拷貝為止.
舉個例子:縣里開大會,只同時通知了A村、B村、C村參加就是組播;同時通知了所有的村子參加就是廣播了!
。應用舉例:如圖所示,在F單元格中輸入公式:=INDEX