大三下-作業(yè)課程設(shè)計(jì)報(bào)告_第1頁
大三下-作業(yè)課程設(shè)計(jì)報(bào)告_第2頁
大三下-作業(yè)課程設(shè)計(jì)報(bào)告_第3頁
大三下-作業(yè)課程設(shè)計(jì)報(bào)告_第4頁
大三下-作業(yè)課程設(shè)計(jì)報(bào)告_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

本次課程設(shè)計(jì)是編寫一個(gè)基于Vxworks系統(tǒng)的類似于的聊天工具,通過程序編寫,使了解Vxworks的編程環(huán)境,加深對(duì)網(wǎng)絡(luò)協(xié)議的理解。Vxworks是當(dāng)下非常流行的操作系統(tǒng),廣泛應(yīng)用于商業(yè),軍事領(lǐng)Vxworks的應(yīng)用程序的開發(fā)是十分有益的。Vxworks本采用標(biāo)準(zhǔn)C語言編寫,以tornado2.2自帶的幫助文檔中《VxworksNetworkProgrammer’sGuideTCP/IP的信息傳輸點(diǎn)和是類似的。服務(wù)器端著所有已用戶,和所有用戶的信息。當(dāng)一個(gè)沒有此聊天系統(tǒng)賬號(hào)的用戶想要使用此時(shí),必須先一個(gè)通過命令,用戶可以知道當(dāng)前用戶的txt文txt文檔刪除。綜上可知,本系統(tǒng)是的簡化版本,以服務(wù)器為中心的,實(shí)現(xiàn)了用管理,即時(shí)、離線文件的傳送。雖然功能無法和真正的相比較,但如備注:由于本是基于Vxworks系統(tǒng),只能在tornado自帶的仿真器Vxsim中進(jìn)行仿真,所以暫時(shí)無法完成圖形界面的編寫。同時(shí),由于學(xué)生寢室的教育網(wǎng)上網(wǎng)于全功能Vxsim仿真器的虛擬網(wǎng)卡本的仿真本系統(tǒng)最的是用鏈表保存的已和用戶信息,通過鏈表相關(guān)函數(shù)的操作,可以方便的添加新的用戶,并使用戶在與離線之間切typedefstruct //已用戶結(jié)構(gòu){charusername[30];charstructregisterInfo*username用來保存賬號(hào)名稱,usercipher用來保存用戶密typedefstruct //用戶結(jié)構(gòu){charusername[30];charuserIP[20];intsFd;structuserInfo*其中,字符創(chuàng)userIP用來保存用于所用客戶端的IP地址,整型變sFdTCP連接分配的套接字號(hào)。鏈表的操作函數(shù)在服務(wù)器端,用戶的登錄和離線對(duì)應(yīng)于用戶鏈表的節(jié)點(diǎn)的增加與刪除,在《數(shù)據(jù)結(jié)構(gòu)》中,已經(jīng)進(jìn)行了詳細(xì)的。當(dāng)新用戶每個(gè)鏈表定義了兩個(gè)指針,headrear,分別表示指向表頭的指針,和n用來記入表長。txt文件保存離線文txt文件操作的函數(shù)庫,對(duì)文件的讀寫,創(chuàng)建,刪除都非常方便。4代"sockLib

"user_linkh"

ix=

O*rear2=intn2=0;"inetLibTCP任務(wù)//鏈表用鏈表"taskLib{{"stdioLib"strLibh"#include"ioLibh""fioLib#include"stdio"tcpExampleh"

////用于綁定的

//用戶鏈表頭表 //用戶鏈表尾指intn1=//用戶人O*head2=

}&rear2,&n2)==0){theregister_user_link } worktask*//*setupthelocaladdress*/sockAddrSize=sizeof(structsockaddr_in);bzero =serverAddr.sin_len=serverAddr.sin_port= TCP-basedsocket*/ SOCK_STREAM,=={return}

socketisright\n");}/*bindsockettolocaladdress*/if(bind(sFd,(structsockaddr*) {closereturn}printf("[server]:bindisright\n");} queueforclientconnectionrequests*/if(listen(sFd, {}{

printf("[server]:listenisright\n");}/*acceptnewconnectrequestsandspawntaskstoprocessthem*/{if=accept(sFd,(struct {closereturn}{printf("[server]: constructed.thesfdis%d\n",newFd);}

newFd,(int)inet_ntoa &rear1,(int)&n1,(int)&rear2,(int)&n2,0)=={close}}}(intsFd,char port,USERINFO**head1,USERINFO** O**rear2,int*{replyMsg[500]=userName[30]="";

(send_flag=={ userIP[20]="";senderName[30]=""; (clientRequest)))>0){("[server]:MESSAGE (InternetAddress%s,port%d):\n%s\n", clientRequestmessage

user%sisloggingout\n",userName);erknowsthatyouare userIDdoesn't//各種錯(cuò)誤情 userIDhasexited");

default:user_flag=ad2,rear2,n2);//用戶向另一用戶發(fā)送消if(user_flag{foundthereceiver:%s

"messagehavebeen //}{//接收用戶出了問題從鏈表中去tosendmessageforsomeerrors");}ntRequest}address);{ //用戶將離

userIDhasalreadybeenonline"); theinputcommand

sender:%s\n",sender

elseif(user_flag==//{strcpy(replyMsg,"thereceiverisnotonline,waitinghimtolog

}freeif(clientRequest

}

close

}{ }{"thereisnosucha}}if(situ>=2&&situ<=5){ 檢查其是否有離線消{usertogetoffline

}{ }}if(nRead==

e(char*receiverName,char*senderName,char*messageSend){FILE*char=if((fp={noofflinefile,createanewfile\n");printf("datasavein%s\n",filePath);

}}FO**head1,char*{ while((ptest!=st->userIP,address)0){ptest=ptest-}printf("find \n",ptest-ptest-}

//charfilePathDelete[100]=

ch= {

reply_Msg[100]="";//char="del

reply_Msg[i]==}

r*requestMessage, ptest=*head1;while((ptest me,address)!=0)){ }//printf("findthe ptest-} {FILE*fp;inti=0;intlengthOrigin;charch;char=

=={ }{ n]='\n';n+1]='\0'; (ch!={(ch=={

reply_Msg[i]={printf("errorinopenfile");}

USERINFO**head1,USERINFO**rear1,O**rear2,int*n2,char*address){user_name[30]="";user_cipher[20]="";intint=len-1; positionofSpace''inti;int printf("thelenghtofmessageis%d\n",ge,"shutdown")==//如果用戶發(fā)送down”,表示其要離{ //terminalisgoingtobeshutdown}{

userconnectingis\n",

return}elseif(flag

}}{(requestMessage[0]==for(i=posiSpace+1; <len;return{for(i=1;;i++{} =='== //用戶登 return或{{for(i=2;;i++{=='{

} posiSpace-1]='\0'; if

}{

userName[i-1]=posiSpace=}userName[i-user_name[i-2]==={=}{posiSpace=returnprintf("theuser wanttosend}is%s\n",for(i=posiSpace+1;}<len;ress))==user_name[i-{={returnmessageSend[i-posiSpace-1]=}messageSend[i-posiSpace-1]='\0';printf("themessagetosendis%s\n",}}}intuser_log(char* USERINFO**head1,USERINFO**rear1, char*address){ {return}{

user_name,n1,address)==0{}{}}}r*user_name,char*{name_user[30]="";name_cipher[20]=""; intFILE*fp2; ER_USER,"r+"))=={

return} numberofregisterreduseris%d\n",for(i=1;i<=num_user;i++){user_name)==0){user_cipher)==0){return}}}return}int

head1,USERINFO** O**rear2,int*{flag_find_user=0; Name,n1,userIP))=={} {return}{ NOT_REGISTER){}{ } numberof usersis%d\n",

=inti;intj;intintposiSpace;FILE*

p1-==if(i=={RINFO*head,int*n){

p1=head;if(*n>0){

ER_USER,"r+"))=={

=*rear=}{

thenumberofonlineusersis%d\n",*n);USERINFO*=if(*n>{onlineuserlist:\n");} { p1-}}GISTERINFO*head,int*n)

} { p1-}} rear,int*{name_user[30]="";name_cipher[20]="";

return} numberofregisterreduseris%d\n",*n);for(i=1;i<={

(*rear)->next== }}return} char*userName,*n,char*{O* userName)!=0)){ptest=ptest-} =={}{}} rear,char*userName,char*userCipher,*n,char*{ {

p1->next(*rear)- *n=*n*n=*n+}returnE_USER,"r+")){user%sis{in\n",return}{printf("user%s return}}rear,char*userName,char*userCipher,{if(*n=={return}

O*p1=*head;while(p1 e,userName)!=0)){ p1-}if(p1=={r,userCipher)==0){validuserID\n");}}} {name_user[30]="";char=

=inti;intj;intintposiSpace;FILE* ;return} numberofonlineuseris%d\n",*n);for(i=1;i<={USERINFO*=

(*rear)-

}}

}{

return==

p1-if(i=={

(*rear)->next= ==*rear=

#include"vxWorksh"#include"sockLibh"#include"inetLibh"#include"stdioLibh"

#include#include#include;#include"taskLib#include"semLibreturn#include}void"tcpExample{flag=#include"tcpclient {flag_log= valid_log=// sockAddrSize=(structbzero

perror

//

flag=

= (u_char)

}{

goto}}

sockAddrSize bzero((char*) _addr=inet_addr { close}

}valid_log=if=={close}

{//當(dāng)netlog

= (u_char) _addr=inet_addr { {//{}begi:if((sFd=socket ==

flag1=

}{if =={

flag1=

}

return

}closeperrorreturn

case3:printf("[caution]:

if(flag=={} ("Messagetosend:while((mlen=readmyRequestmessage,E))==myRequestmsgLen myRequestmessage[mlen-1]='\0'; myRequestmessage);{case1:printf("theterminalisgoingtoshut 關(guān)閉flag=

emptyflag1=}=={flag1=goto}questmessage);if(connect(sFd,(structsockaddr*) {perrorclose

("[client]:Wouldyoulikeareply(Yor(STD_IN,&reply,1);{case'y': 'Y':myRequestreply=myRequestreply }myRequestreply if(sFd,(char*)&myRequest,sizeof {

printf("toshutdownthe}}}void{ix=case2:printf("[caution]:invalidmessage\n");

}{

perrorclose

/*nameofworktask*//*setupthelocaladdress*/sockAddrSize bzero((char*)= (u_char) htons(5002); TCP-basedsocket*/if((sFd=socket =={("errorsocketnetlist

}{ socketis}/*bindsockettolocaladdress*/ {("errorbind close(sFd);}{ bindis}

/*createqueuefor requests*/ { listennetlisclose(sFd);}{ listenis}/*acceptnewconnectrequestsandspawntaskstoprocessthem*/{if((newFd=accept(sFd,(struct

{ close}printf("[client]:anewmessage\n"); } } 設(shè)為了實(shí)現(xiàn)類似于的聊天工具,單獨(dú)設(shè)立一個(gè)服務(wù)器來中轉(zhuǎn)消息,每sockLib.hwrite(),fioRead()TCP連接中的數(shù)據(jù)流的寫與讀((r)用戶向另一用戶發(fā)送消息令的格式為:’t’+接受用戶名+空格+消用戶關(guān)閉客戶端令格式為:’shut’+空格因?yàn)槭窃趕im下真,用戶命令的輸入是在框中完成,所以必須嚴(yán)格按此格式輸入信息才有效,在客戶端,系統(tǒng)會(huì)調(diào)用函數(shù)先將用戶輸入令進(jìn)行檢錯(cuò)只有為合法令客戶端才會(huì)將命令發(fā)送給服務(wù)器事實(shí)上,如果采用圖形界面的話,命令的輸入可以由按鈕來完成,這樣用戶不可能輸入錯(cuò)誤令。在服務(wù)器端,即使是合法令格式也可能是無效令。比如用戶登陸時(shí)輸入的賬戶不存在,或此賬戶已,用戶向不存在的賬戶發(fā)送消通過約定好令格式以及嚴(yán)格令檢錯(cuò)機(jī)制,本系統(tǒng)在框下 服務(wù)器端:服務(wù)器在正常情況下應(yīng)24小時(shí)不間斷工作,第一次啟動(dòng)服務(wù)器時(shí),可以從一個(gè)保存了所有已用戶信息的txt文檔中數(shù)據(jù),將已用戶信息鏈表初始化然后通過綁定相關(guān)端口對(duì)客戶端的TCP連接請(qǐng)求進(jìn)行,一旦有新的TCP連接,服務(wù)器會(huì)為此用戶分配一個(gè)套接字,將收到的消息進(jìn)行處理,根據(jù)不同令格式,采取不同的操作。客戶端:客戶端開始運(yùn)行后會(huì)提示用戶進(jìn)行登陸或操作。完成后,orks可以方便的分別用來用戶的登陸發(fā)送消息接受消息關(guān)閉客戶端其優(yōu)先級(jí)不同,關(guān)閉客戶端任務(wù)優(yōu)先級(jí)最高,但一開始其便被阻塞,僅當(dāng)用戶輸入”tdow”或出錯(cuò)時(shí)才其信號(hào)量此任務(wù)將關(guān)閉其他三個(gè)任務(wù)同用戶登陸任務(wù)首先運(yùn)行當(dāng)運(yùn)行完后其將信號(hào)量發(fā)送消息與接收消息任務(wù)開始運(yùn)行。7.xworks本次程序設(shè)計(jì)的難點(diǎn)是Vxworks的開發(fā)環(huán)境由于是在Vxsim中仿真并沒有到實(shí)際的目標(biāo)板中此次程序設(shè)計(jì)主體上和在Windows下的CVxworks獨(dú)有的特點(diǎn)。Vxworks中Windows優(yōu)先級(jí)和對(duì)應(yīng)的信號(hào)量,Vxworks的內(nèi)核便可以自動(dòng)的進(jìn)行多任務(wù)的運(yùn)行。同時(shí)由于是網(wǎng)絡(luò)編程,需要建立全功能仿真器環(huán)境。Tornado下默認(rèn)的ULIP>->”從磁盤安裝接著選擇tornado\host\x86-win32\bin\下的netULIP.inf,ipconfig/all的輸出中可看到多了一個(gè)windriverulip;ULIP2配置。在IP欄輸入192.168.255.254(可以是.254,子網(wǎng)掩碼設(shè)為NETBIOS用“電腦,選擇“服務(wù),找到“RoutigandRemotes”4表示過的用戶數(shù),dinggaoqiang是用戶名,8888是,用戶名和密碼間有一個(gè)空格。并且在 盤新建文件夾F:\Tornado2.2\data_user\messageToSend將已經(jīng)創(chuàng)建好的project文件夾到C盤的Tornado2.2文件夾里。然后通Project10.wpjtornado了。打開project10.wpj的另外法是:打開Tornado,選擇file—Tornado的運(yùn)打開Tornado之后,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論