国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

網(wǎng)絡(luò)仿真平臺OMNetPP在網(wǎng)絡(luò)類課程教學(xué)中的應(yīng)用

2011-06-26 12:51
關(guān)鍵詞:服務(wù)端IP地址交換機(jī)

王 華

網(wǎng)絡(luò)通訊類課程是許多工科專業(yè)重要必修課程,也是一門非常實(shí)用,能很好適應(yīng)社會需求的課程。但是,在該類課程教學(xué)過程中往往存在理論較多、較空洞抽象的問題,學(xué)生看不到具體的網(wǎng)絡(luò)運(yùn)行方式,而僅僅停留在概念層面的認(rèn)識,而且網(wǎng)絡(luò)類課程實(shí)驗(yàn)硬件平臺價格不菲,不同的實(shí)驗(yàn),需要不同的硬件支撐。采用網(wǎng)絡(luò)仿真軟件可以很方便快捷地建立網(wǎng)絡(luò)拓?fù)?、仿真?jīng)典網(wǎng)絡(luò)模型,并且可以查看網(wǎng)絡(luò)拓?fù)渲忻總€網(wǎng)絡(luò)模塊的動態(tài)變化的參數(shù)結(jié)果,同時還可以生成實(shí)時仿真數(shù)據(jù)圖。OMNetPP就是這樣一個優(yōu)秀的開源的基于模塊化的網(wǎng)絡(luò)仿真平臺,作為離散事件仿真器,OMNetPP具備強(qiáng)大且完善的圖形界面接口和嵌入式仿真內(nèi)核;OMNetPP可運(yùn)行于多個操作系統(tǒng)平臺,并且可簡便定義網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu),具備編程,調(diào)試和跟蹤支持等功能[1]。OMNetPP主要用于通信網(wǎng)絡(luò)和分布式系統(tǒng)的仿真,同時還適合離散事件系統(tǒng)的模擬[2]。

1 OMNetPP體系結(jié)構(gòu)

OMNetPP主要由仿真內(nèi)核庫(simulation kernel library)、網(wǎng)絡(luò)描述語言的編譯器(network description compiler)、圖形化的網(wǎng)絡(luò)編輯器(graphical network description editor,GNED)、仿真程序的圖形化用戶接口環(huán)境TKEnv和仿真程序的命令行用戶接口環(huán)境Cmd Env等組成。另外,對于數(shù)據(jù)的輸出,平臺還提供了圖形化的矢量輸出工具Plove和標(biāo)量輸出工具Scalar[3]。OMNetPP仿真平臺同時還提供了可供其他高級編程語言如VC2005等編程接口,通過VC2005程序調(diào)用OMNetPP仿真平臺的Sim內(nèi)核和類庫,可以實(shí)現(xiàn)自定義的網(wǎng)絡(luò)模型的仿真模擬。OMNetPP的結(jié)構(gòu)體系如圖1所示。

圖1 OMNetPP體系結(jié)構(gòu)圖Fig.1 Structure of OMNetPP

一個網(wǎng)絡(luò)模型在OMNetPP仿真平臺中通常是由分層的嵌套的模塊組成的,頂層模塊為系統(tǒng)模塊,系統(tǒng)模塊由組合模塊組成,組合模塊由簡單模塊組成[3],簡單模塊還可以由它們自身的子模塊組成,如圖2所示。OMNetPP模塊嵌套的深度可以是無窮的,模塊與模塊之前是通過消息來進(jìn)行通信的,OMNetPP的簡單模塊是整個網(wǎng)絡(luò)模型的活動模塊,采用C++語言簡定義功能。

圖2 簡單模塊和組合模塊關(guān)系Fig.2 Relationship between simple module and composite module

在OMNetPP仿真平臺中,圖形化的網(wǎng)絡(luò)編輯器gned.exe可以將所有網(wǎng)絡(luò)模塊圖形化地實(shí)現(xiàn),包括每個模塊之間的連接關(guān)系,相應(yīng)的文件擴(kuò)展名為ned的文件只需要將編輯好的ned文件連同每個模塊的C++文件及OMNetPP.ini配置文件放置在一個目錄下面,然后啟動VC2005工程就可以進(jìn)行聯(lián)合編譯。

2 客戶端與服務(wù)端網(wǎng)絡(luò)通信的仿真實(shí)例

通信流程:多個客戶端通過交換機(jī)與服務(wù)器相連,每個客戶端發(fā)送的網(wǎng)絡(luò)數(shù)據(jù)包首先經(jīng)過交換機(jī),然后被轉(zhuǎn)發(fā)到服務(wù)器。服務(wù)器接收到數(shù)據(jù)包后向交換機(jī)發(fā)送響應(yīng)數(shù)據(jù)包,交換機(jī)根據(jù)數(shù)據(jù)包中的目的地址,轉(zhuǎn)發(fā)給相應(yīng)的客戶端。該客戶端接收到交換機(jī)轉(zhuǎn)發(fā)來的服務(wù)端數(shù)據(jù)包后延遲一定時間后繼續(xù)向服務(wù)端發(fā)送網(wǎng)絡(luò)數(shù)據(jù)包,一直循環(huán)下去。

網(wǎng)絡(luò)描述(ned)文件設(shè)計(jì)如下:整個網(wǎng)絡(luò)模塊CSNetwork由客戶端簡單模塊、交換機(jī)簡單模塊、服務(wù)器簡單模塊組成。3個簡單模塊之間的通信是用消息(網(wǎng)絡(luò)數(shù)據(jù)包)來實(shí)現(xiàn)的,3個簡單模塊之間存在一系列的連接關(guān)系,這里每個客戶端模塊都和交換機(jī)模塊進(jìn)行雙向連接,交換機(jī)模塊和服務(wù)器模塊進(jìn)行雙向連接,如圖3所示。

圖3 客戶端與服務(wù)端網(wǎng)絡(luò)通信拓?fù)浣Y(jié)構(gòu)圖Fig.3 Topology of communication between client and server

圖3 中,左側(cè)屬性列表中列舉了客戶端簡單模塊、服務(wù)端簡單模塊、交換機(jī)簡單模塊和CSNetwork組合模塊??蛻舳撕唵文K聲明了字符串類型的客戶端IP地址參數(shù)IPAddress,以及消息輸入輸出門(就是指網(wǎng)絡(luò)連接);交換機(jī)簡單模塊僅僅聲明了所有的進(jìn)出交換機(jī)的連接,也就是in[]和out[]門矢量;服務(wù)端模塊聲明了IP地址和接收的總幀數(shù)2個參數(shù),同時也聲明了和交換機(jī)連接的數(shù)據(jù)包進(jìn)出的2個連接。整個CSNetwork通信網(wǎng)組合模塊的描述如下:

module CSNetwork

parameters:

ClientNum:numeric const;

submodules:

client1:Client;

display:"i=device/laptop_l;p=85,77";

client3:Client;

display:"p=448,172;i=device/pc3_l";

client2:Client;

display:"p=348,52;i=device/pc_l";

switch:Switch;

display:"p=228,156;i=device/switch_l;o=#0000ff";

server:Server;

display:"p=233,314;i=device/server_l";

client4:Client;

display:"p=48,276;i=device/pc4_l";

client5:Client;

display:"p=432,304;i=device/laptop_l";

connections:

client1.out-->switch.in++;

client2.out-->switch.in++;

client3.out-->switch.in++;

client4.out-->switch.in++;

client5.out-->switch.in++;

switch.out++-->client1.in;

switch.out++-->client2.in;

switch.out++-->client3.in;

switch.out++-->client4.in;

switch.out++-->client5.in;

switch.out++-->server.in;

server.out-->switch.in++;

display:"b=471,397";

endmodule

network CSNetwork:CSNetwork

endnetwork

該組合模塊中定義了客戶端的個數(shù)、每個子模塊的顯示位置、顯示的圖標(biāo)參數(shù)、每個子模塊之間存在的連接關(guān)系等。

圖3右側(cè)是客戶端與服務(wù)端網(wǎng)絡(luò)通信的拓?fù)浣Y(jié)構(gòu)圖,程序運(yùn)行后OMNetPP內(nèi)核將會以動畫的形式顯示拓?fù)浣Y(jié)構(gòu)的動態(tài)數(shù)據(jù)流動。每個子模塊都是用C++語言實(shí)現(xiàn)具體的功能的,包括數(shù)據(jù)的初始化,對接收的網(wǎng)絡(luò)數(shù)據(jù)包進(jìn)行處理等??紤]到傳遞消息的功能特殊性,包括獲取消息源、設(shè)定目的地址等。本例中特別定制了消息的特殊部分,也就是對cMessage類進(jìn)行了重載,生成CComMsg類。步驟如下:首先用文本編輯器編輯一個擴(kuò)展為msg的消息文件ComMsg.msg,該消息的具體數(shù)據(jù)成員定義如下:

message CComMsg

{

fields:

string source;//源地址

string destination;//目的地址

int PackSize;//包大小

}

新的消息格式中定義了數(shù)據(jù)源、目的地址及數(shù)據(jù)包大小,然后用OMNetPP安裝目錄下Bin子目錄中的opp_msgc工具將ComMsg.msg自定義消息文件轉(zhuǎn)化為ComMsg_m.cc這樣一個C++文件,以后客戶端模塊、交換機(jī)模塊、服務(wù)端模塊相互通信的消息都從CComMsg類繼承。

客戶端簡單模塊的C++文件中,必須調(diào)用OMNetPP核心注冊宏Define_Module()注冊用戶定義的客戶端C++類CClient,只有注冊后才可被OMNetPP內(nèi)核調(diào)用[4]。在客戶端類(CClient)中,有默認(rèn)的initialize()和handleMessage(cMessage*msg)兩個方法,initialize()主要是做一些數(shù)據(jù)的初始化,比如本例中客戶端IP地址的讀取,服務(wù)器端地址的讀取,以及客戶端等,定義如下:

void CClient::initialize()

{

std::string strClient=name();//獲取當(dāng)前客戶端的名稱

CComMsg*pMsg=new CComMsg("Client create msg");//客戶端創(chuàng)建消息

pSelfMsg=new cMessage("self message");//創(chuàng)建發(fā)送給自己的消息用于延時

pk LenBits=&par("pk LenBits");//讀取當(dāng)前客戶端的包長

txRate=par("tx Rate");//讀取當(dāng)前客戶端數(shù)據(jù)包發(fā)送速率

cPar*ParObj=&par("IPAddress");//獲取IP地址參數(shù)對象

strIPAdd=ParObj->stringValue();//讀取當(dāng)前客戶端的IP地址

pMsg->setSource(strIPAdd.c_str());//設(shè)置要發(fā)送消息的數(shù)據(jù)源地址

cModule*server=simulation.moduleBy Path("server");//獲取 server模塊指針

ParObj=&(server->par("IPAddress"));//獲取服務(wù)端的IP地址

pMsg->setDestination(ParObj->stringValue());//設(shè)置要發(fā)送消息的目的地址

send(p Msg,"out");//向輸出連接發(fā)送消息

}

在handleMessage事件中主要接收各種消息包括自定義消息、交換機(jī)轉(zhuǎn)發(fā)過來的消息等,根據(jù)不同的要求對不同的消息進(jìn)行處理。本例中對于客戶端自身發(fā)送的消息主要是用于延時,當(dāng)接收到自身消息以后,此時可以對上次接收的交換機(jī)轉(zhuǎn)發(fā)的網(wǎng)絡(luò)數(shù)據(jù)包進(jìn)行處理。如果接收的消息是交換機(jī)轉(zhuǎn)發(fā)過來的消息,則此時客戶端并不立即發(fā)送響應(yīng)數(shù)據(jù)包給服務(wù)器,而是先保存此消息,然后給自己發(fā)送一個延時數(shù)據(jù)包,延時的時間由客戶端的發(fā)送速率和數(shù)據(jù)包長度決定。核心處理代碼如下:

void Client::handleMessage(cMessage*msg)

{

if(!msg->isSelf Message())//如果不是自定義消息

{

pMyMsg=check_and_cast<CHost*>(msg);//將交換機(jī)轉(zhuǎn)發(fā)的消息保存下來

double Delay Time=pk LenBits->doubleValue()/tx Rate;//計(jì)算延時時間

scheduleAt(simTime()+Delay Time,pSelf Msg);//給自己發(fā)送消息,以作延時用

return;

}

else//自定義消息,則繼續(xù)向服務(wù)器發(fā)送消息

{

if(pMyMsg)//如果已經(jīng)接收到服務(wù)器發(fā)送來的消息

{

char Tip[100]="";

sprintf_s(Tip,"%s receive self-message and send msg to server",name());

ev<<Tip<<endl;//離散事件界面顯示提示信息

std::string strDestIP=pMyMsg->getDestination();//獲取消息的目的地址

pMyMsg->setDestination(p My Msg->getSource());//設(shè)置發(fā)送消息的目的地址

pMyMsg->setSource(strDestIP.c_str());//設(shè)置消息的數(shù)據(jù)源地址

send(pMyMsg,"out");//向服務(wù)器發(fā)送消息

}

}

}

與客戶端簡單模塊的C++實(shí)現(xiàn)一樣,服務(wù)端簡單模塊的C++實(shí)現(xiàn)也要首先調(diào)用OMNetPP核心注冊宏Define_Module(),注冊服務(wù)端模塊后,在服務(wù)端模塊的initialize()方法中初始化模塊的參數(shù),同時在handleMessage事件響應(yīng)方法中處理來自各客戶端通過交換機(jī)轉(zhuǎn)發(fā)過來的消息(數(shù)據(jù)包),核心代碼如下:

void Server::handleMessage(cMessage*msg)

{

CHost*package=check_and_cast<CHost*>(msg);//強(qiáng)制類型轉(zhuǎn)換

std::string strDestIP=package->getDestination();//提取網(wǎng)絡(luò)數(shù)據(jù)包的目的地址

cPar*ParObj=&par("IPAddress");//獲取IP地址參數(shù)信息

std::string strServIP=ParObj->stringValue();//將IP地址對象轉(zhuǎn)為字符串類型

std::string strSrcIP=package->getSource();//數(shù)據(jù)包的來源(IP地址)

if(strDestIP==strServIP)//如果是地址匹配

{

bubble("send msg to client");//提示發(fā)送消息

package->setSource(strServIP.c_str());//設(shè)置消息(數(shù)據(jù)包)來源

package->setDestination(strSrcIP.c_str());//設(shè)置消息(數(shù)據(jù)包)地址

send(package,"out");//發(fā)送消息

}

}

交換機(jī)簡單模塊C++代碼的結(jié)構(gòu)和客戶端、服務(wù)端代碼結(jié)構(gòu)類似,在其initialize方法中主要是獲取所有客戶端的IP地址信息和服務(wù)端的IP地址信息,在其handleMessage方法中主要是將服務(wù)端發(fā)送來的消息根據(jù)目的地址轉(zhuǎn)發(fā)給相應(yīng)的客戶端,將客戶端發(fā)送來的消息轉(zhuǎn)發(fā)給服務(wù)端,轉(zhuǎn)發(fā)不做任何延時。

OMNetPP程序啟動后,首先加載程序相同目錄下的所有NED文件,這些文件在OMNetPP.ini文件中被指定加載[5],然后內(nèi)核加載所有相關(guān)的模塊對應(yīng)的圖片信息,還有相應(yīng)配置文件中的參數(shù)的初始化值[6]。選擇相應(yīng)的網(wǎng)絡(luò)模型名稱,并且運(yùn)行后生成圖4和圖5。

圖4 TKEnv模擬環(huán)境離散事件狀態(tài)顯示Fig.4 Discrete event of TKEnv

圖5 網(wǎng)絡(luò)數(shù)據(jù)包交換動態(tài)效果圖Fig.5 Dynamic exchange of network packet

圖4 中,左側(cè)樹形列表中呈現(xiàn)的是網(wǎng)絡(luò)組合模塊中所有的子模塊信息,包括每個子模塊當(dāng)前觸發(fā)的事件信息、參數(shù)信息等;樹列表的下部是當(dāng)前組合模塊中所有事件類型,包括客戶端發(fā)送數(shù)據(jù)包給服務(wù)端的事件和服務(wù)端發(fā)送數(shù)據(jù)包給客戶端的事件;右側(cè)下部區(qū)域藍(lán)色字體表示仿真開始后某一個時間點(diǎn)發(fā)生的事件,本例中很多事件是并行發(fā)生的。在圖4中,可以很清楚地看到子模塊發(fā)送的自消息數(shù)目(發(fā)送給自身的數(shù)據(jù)包),發(fā)送給其他子模塊消息數(shù)目,整個網(wǎng)絡(luò)的事件總數(shù),每個事件的觸發(fā)時間,仿真的速度等信息。而圖5則是網(wǎng)絡(luò)數(shù)據(jù)包的動態(tài)交換效果圖,該圖實(shí)時地現(xiàn)實(shí)網(wǎng)絡(luò)數(shù)據(jù)包的流向。

3 結(jié) 語

通過基于OMNetPP仿真平臺,可以對數(shù)據(jù)通訊與計(jì)算機(jī)網(wǎng)絡(luò)課程中的各種網(wǎng)絡(luò)模型,諸如ALOHA協(xié)議、路由協(xié)議、令牌環(huán)及Socket通信等,進(jìn)行仿真,用C++語言實(shí)現(xiàn)網(wǎng)絡(luò)模型中的每個模塊,然后用VC2005連接OMNetPP內(nèi)核編譯后就可實(shí)現(xiàn)網(wǎng)絡(luò)模型中數(shù)據(jù)包流動的動態(tài)效果。這些網(wǎng)絡(luò)仿真對于數(shù)據(jù)通訊與計(jì)算機(jī)網(wǎng)絡(luò)等課程的教學(xué)起到重要的作用,學(xué)生可以很直觀地看到網(wǎng)絡(luò)模型的運(yùn)行效果,同時學(xué)生自己還可以擴(kuò)展每個模塊,讓網(wǎng)絡(luò)模塊按照自己的思路處理網(wǎng)絡(luò)數(shù)據(jù)包。OMNetPP仿真平臺不僅可以用于有線網(wǎng)絡(luò)的仿真,而且還可以用于諸如3G通信、無線傳感器網(wǎng)絡(luò)等無線網(wǎng)絡(luò)的模擬仿真。

[1] OMNetPP工作組.OMNetPP用戶幫助手冊[EB/OL].[2010-11-20].http://www.omnetpp.org/doc/omnetpp41/manual/usman.html.

[2] OMNetPP工作組.OMNetPP中文使用手冊[EB/OL].[2010-11-20].http://wenku.baidu.com/view/3f3f0d3b87c24028915fc3b9.html.

[3] VARGA A.OMNeT++Discrete Event Simulation System User Manual(Version 3.2)[EB/OL].[2011-11-20].http://www.omnetpp.org/doc/manual/usmen.html.

[4] K?PKEA,SWIGULSKI M,WESSEL K,et al.Simulating wireless and mobile networks in OMNeT++the MiXiM vision[C]//Proceedings of the 1st international conference on simulation tools and techniques for communications,networks and systems&workshops.Marseille:[s.n.],2008.

[5] 操敏,李文鋒,袁兵.基于OMNeT++的Leach協(xié)議的仿真研究[J].交通與計(jì)算機(jī),2007(1):125-128.

[6] 鐘幼平,黃佩偉,汪波.基于OM NeT++平臺的SMAC協(xié)議仿真實(shí)現(xiàn)[J].信息技術(shù),2008(2):29-33.

猜你喜歡
服務(wù)端IP地址交換機(jī)
鐵路遠(yuǎn)動系統(tǒng)幾種組網(wǎng)方式IP地址的申請和設(shè)置
更換匯聚交換機(jī)遇到的問題
基于地鐵交換機(jī)電源設(shè)計(jì)思考
新時期《移動Web服務(wù)端開發(fā)》課程教學(xué)改革的研究
締造工業(yè)級的強(qiáng)悍——評測三旺通信IPS7110-2GC-8PoE工業(yè)交換機(jī)
公安網(wǎng)絡(luò)中IP地址智能管理的研究與思考
《IP地址及其管理》教學(xué)設(shè)計(jì)
羅克韋爾自動化交換機(jī)Allen-Bradley ArmorStratix 5700
摸清黑客套路防范木馬侵入
沁阳市| 松潘县| 西城区| 南平市| 惠州市| 丽江市| 荔波县| 惠来县| 固镇县| 文成县| 五大连池市| 丰县| 铜川市| 平舆县| 思南县| 黄浦区| 铜梁县| 新营市| 鹰潭市| 高雄市| 襄垣县| 连江县| 长岛县| 元阳县| 依安县| 红桥区| 广西| 江口县| 灵川县| 麻城市| 永新县| 托里县| 天柱县| 沁水县| 新邵县| 朝阳市| 尼勒克县| 阳山县| 洛浦县| 泰顺县| 如东县|