




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 加盟連鎖招商合同范本
- 國家旅游課題申報(bào)書
- 辦公購置合同范本
- 單位套房出售合同范本
- 售賣義齒器械合同范本
- 建設(shè)知識(shí)產(chǎn)權(quán)保護(hù)高地的實(shí)施細(xì)則與規(guī)劃
- 員工欠款合同范本
- 黨務(wù)材料外包合同范本
- 品牌油漆采購合同范本
- 合同范本書庫
- 2024年徐州生物工程職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性測試題庫及答案解析
- 重點(diǎn)關(guān)愛學(xué)生幫扶活動(dòng)記錄表
- 2024年部編版五年級(jí)下冊(cè)語文第一單元綜合檢測試卷及答案
- 5-6歲幼兒園小學(xué)美術(shù)PPT課件教案教程創(chuàng)意幼教手工《樹懶》
- 牛津譯林英語七年級(jí)上冊(cè)7AUnits1-4單元復(fù)習(xí)課件
- 《義務(wù)教育道德與法治課程標(biāo)準(zhǔn)(2022年版)》
- 2023北京高三一模語文匯編:非連續(xù)性文本閱讀
- 初中物理核心素養(yǎng)培養(yǎng)
- 保安公司招聘筆試題及答案
- 介紹錢三強(qiáng)的
- 農(nóng)業(yè)資源與環(huán)境經(jīng)濟(jì)學(xué)
評(píng)論
0/150
提交評(píng)論