李文濤
摘 要:簡要介紹了VxWorks系統(tǒng)下實現(xiàn)網(wǎng)絡多IP地址通信的方法,分析了網(wǎng)絡通信技術(shù)的優(yōu)勢,探討了網(wǎng)絡UDP使用多IP地址和不同Socket端口傳輸技術(shù)在VxWorks系統(tǒng)下的具體應用,并針對相關(guān)實際應用給出了解決方法,在工程應用中具有一定的實用價值。
關(guān)鍵詞:VxWorks;Tornado;Socket;IP地址
中圖分類號:TP393.03 文獻標識碼:A DOI:10.15913/j.cnki.kjycx.2015.10.110
在工程實踐中,經(jīng)常會用到設備之間的數(shù)據(jù)通訊,主要包括串口通信、并口通信、網(wǎng)絡通信和1553B總線通信等。隨著通訊技術(shù)的進步,網(wǎng)絡通訊技術(shù)以價格低廉、連接方便等優(yōu)勢逐漸成為了各種設備接口互聯(lián)的主要手段,并被廣泛應用于計算機網(wǎng)絡領(lǐng)域。網(wǎng)絡通信以其開發(fā)簡單、可靠性高、抗干擾性強和傳輸距離長等特點,被廣泛應用到了互聯(lián)通信、軍事、航空和航天等技術(shù)領(lǐng)域。
1 VxWorks網(wǎng)絡傳輸?shù)奶攸c
VxWorks是美國風河公司(WindRiver)設計開發(fā)的一種嵌入式實時操作系統(tǒng),它是嵌入式開發(fā)環(huán)境的關(guān)鍵組成部分,而Tornado是其主機的集成開發(fā)環(huán)境。VxWorks的內(nèi)核具有實時微內(nèi)核的性能特點,比如快速的任務調(diào)度、中斷延遲時間短、同時支持搶占式調(diào)度和時間片輪轉(zhuǎn)調(diào)度。VxWorks操作系統(tǒng)會根據(jù)任務緩急程度設置通訊任務的優(yōu)先級別,通過搶占的方式執(zhí)行優(yōu)先級高的任務。在工程實踐過程中,經(jīng)常會用到多個設備之間的通訊,這就要求工作人員設置網(wǎng)絡收發(fā)任務,根據(jù)任務之間緩急程度的不同設置任務的優(yōu)先級。VxWorks網(wǎng)絡傳輸除了具有與其他操作系統(tǒng)相同的優(yōu)勢外,還具備實時性高、可靠、安全等特點。
2 VxWorks系統(tǒng)中網(wǎng)絡多地址通信的實現(xiàn)
在Tornado中創(chuàng)建VxWorks工程時,先打開BSP所在目錄,在CONFIG.H和CONFIGNET.H文件中聲明用到的網(wǎng)卡名,編譯生成BOOTROM文件。當VxWorks系統(tǒng)啟動完畢后,可以在當前開發(fā)工程下的用戶程序接口函數(shù)usrAppInit中或者自己開發(fā)的應用程序初始化函數(shù)中添加代碼完成基本的網(wǎng)絡配置。文中以PCPentium自帶的BSP包中的Intel 8255X系列網(wǎng)絡芯片為例,介紹同一網(wǎng)卡下不同IP地址、網(wǎng)關(guān)和子網(wǎng)掩碼的配置方法。
ipAttach(0,"fei");
ifAddrSet("fei0","192.10.1.15");
ifMaskSet("fei0",0xffffff00);
if(InitSocket("192.10.1.15",0x2000,Handleone)== TRUE);
ifAddrAdd("fei0","165.10.1.16","165.10.1.255",0xffff0000);
if(InitSocket("165.10.1.16",0x3000,Handletwo)== TRUE);
完成網(wǎng)卡IP地址、網(wǎng)關(guān)和子網(wǎng)掩碼配置后,要選擇和建立通信端口,并確認通訊協(xié)議。選用的端口號要根據(jù)設備間的接口協(xié)議確定,在沒有規(guī)定的情況下,可以選擇1025~32767之間的任何一個沒有被占用的端口號。
TCP與UDP協(xié)議在套接字編程中的區(qū)別是:Socket是程序間通信的方法。在建立套接字時,TCP使用Stream Sockets(流格式)的套接字,UDP使用Datagram Sock-ets(數(shù)據(jù)包格式),在程序中分別用SOCK-STREAM和SOCK-DGRAM標識。由于TCP是面向連接的,所以,在服務器程序中,要偵聽(Listen())端口,客戶端設置連接(Connect()),而后在服務器端接收(Accept())。這在UDP中是不需要的,在服務器中的UDP程序中,只需要一個接收程序Recvfrom( ),而在客戶端需要一個發(fā)送函數(shù)Sendto( )。那么,為什么有的UDP程序中也會出現(xiàn)連接函數(shù)Connect( )呢?因為Connect()函數(shù)中包含了目標地址。接下來就可以用Send()和Receive( )來代替Sendto( )和Recvfrom( )函數(shù),而系統(tǒng)套接字接口會自動加上目標和源的相關(guān)信息。
總之,TCP和UDP是2種不同的網(wǎng)絡傳輸層協(xié)議,是實用且可行的。用戶可以根據(jù)自己不同的需要選擇協(xié)議類型。
以UDP通信為例,簡單介紹通信端口建立的過程:①創(chuàng)建套接字。利用socket()創(chuàng)建套接字。②給創(chuàng)建的套接字命名。用bind()函數(shù)將所需地址捆綁到創(chuàng)建的套接字上,用Setsockopt()函數(shù)設置包括Broadcast的數(shù)據(jù),完成套接字的創(chuàng)建后就可以用Sendto()和Recvfrom()實現(xiàn)指定端口的UDP數(shù)據(jù)收發(fā)。③關(guān)閉套接字。當所有的數(shù)據(jù)操作結(jié)束后,應調(diào)用close()函數(shù)釋放不用的套接字,從而停止該端口上的數(shù)據(jù)操作。
3 套接字創(chuàng)建程序和說明
Int InitSocket(char * localAddr,UINT localPort,int *intSocketHandle)
{/****套嵌字創(chuàng)建***/
struct sockaddr_in soc;
int Socket, sockAddrSize;/*變量定義*/
BOOL bl=TRUE;
Socket = socket (AF_INET,SOCK_DGRAM, 0);/*創(chuàng)建套嵌字*/
if (Socket == ERROR)/*創(chuàng)建套嵌字失敗*/
{
return FALSE;/*返回錯誤值*/
}
sockAddrSize = sizeof (struct sockaddr_in);
bzero ((char *)& soc, sockAddrSize);
soc.sin_len = (u_char) sockAddrSize;
soc.sin_family = AF_INET;
soc.sin_port = htons ((short)localPort);/*端口*/
soc.sin_addr.s_addr =inet_addr(localAddr);
if (bind(Socket, (SOCKADDR *)&soc,sizeof(soc)) == ERROR)
{
return FALSE;/*返回錯誤值*/
} if(setsockopt(Socket,SOL_SOCKET ,SO_BROADCAST,(char*)&(bl),sizeof(bl))==ERROR)
{
return FALSE;/*返回錯誤值*/
}
return TRUE;/*返回正確值*/
}
4 結(jié)束語
本文設計了一種基于Vxworks系統(tǒng)的多IP地址多端口的UDP網(wǎng)絡通信方法,該方法已在實際設計的軟件模擬器中仿真實現(xiàn),并完成了大量不同數(shù)據(jù)包的收發(fā)。通過網(wǎng)絡監(jiān)視工具監(jiān)測整個通信過程,無丟包和數(shù)據(jù)錯誤的情況發(fā)生,保證了同一網(wǎng)卡下多地址數(shù)據(jù)傳輸?shù)姆€(wěn)定性。
〔編輯:白潔〕