




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
本次課程設計是編寫一個基于Vxworks系統(tǒng)的類似于的聊天工具,通過程序編寫,使了解Vxworks的編程環(huán)境,加深對網(wǎng)絡協(xié)議的理解。Vxworks是當下非常流行的操作系統(tǒng),廣泛應用于商業(yè),軍事領Vxworks的應用程序的開發(fā)是十分有益的。Vxworks本采用標準C語言編寫,以tornado2.2自帶的幫助文檔中《VxworksNetworkProgrammer’sGuideTCP/IP的信息傳輸點和是類似的。服務器端著所有已用戶,和所有用戶的信息。當一個沒有此聊天系統(tǒng)賬號的用戶想要使用此時,必須先一個通過命令,用戶可以知道當前用戶的txt文txt文檔刪除。綜上可知,本系統(tǒng)是的簡化版本,以服務器為中心的,實現(xiàn)了用管理,即時、離線文件的傳送。雖然功能無法和真正的相比較,但如備注:由于本是基于Vxworks系統(tǒng),只能在tornado自帶的仿真器Vxsim中進行仿真,所以暫時無法完成圖形界面的編寫。同時,由于學生寢室的教育網(wǎng)上網(wǎng)于全功能Vxsim仿真器的虛擬網(wǎng)卡本的仿真本系統(tǒng)最的是用鏈表保存的已和用戶信息,通過鏈表相關函數(shù)的操作,可以方便的添加新的用戶,并使用戶在與離線之間切typedefstruct //已用戶結(jié)構(gòu){charusername[30];charstructregisterInfo*username用來保存賬號名稱,usercipher用來保存用戶密typedefstruct //用戶結(jié)構(gòu){charusername[30];charuserIP[20];intsFd;structuserInfo*其中,字符創(chuàng)userIP用來保存用于所用客戶端的IP地址,整型變sFdTCP連接分配的套接字號。鏈表的操作函數(shù)在服務器端,用戶的登錄和離線對應于用戶鏈表的節(jié)點的增加與刪除,在《數(shù)據(jù)結(jié)構(gòu)》中,已經(jīng)進行了詳細的。當新用戶每個鏈表定義了兩個指針,headrear,分別表示指向表頭的指針,和n用來記入表長。txt文件保存離線文txt文件操作的函數(shù)庫,對文件的讀寫,創(chuàng)建,刪除都非常方便。4代"sockLib
"user_linkh"
ix=
O*rear2=intn2=0;"inetLibTCP任務//鏈表用鏈表"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//各種錯誤情 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}
{//當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 關閉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"); } } 設為了實現(xiàn)類似于的聊天工具,單獨設立一個服務器來中轉(zhuǎn)消息,每sockLib.hwrite(),fioRead()TCP連接中的數(shù)據(jù)流的寫與讀((r)用戶向另一用戶發(fā)送消息令的格式為:’t’+接受用戶名+空格+消用戶關閉客戶端令格式為:’shut’+空格因為是在sim下真,用戶命令的輸入是在框中完成,所以必須嚴格按此格式輸入信息才有效,在客戶端,系統(tǒng)會調(diào)用函數(shù)先將用戶輸入令進行檢錯只有為合法令客戶端才會將命令發(fā)送給服務器事實上,如果采用圖形界面的話,命令的輸入可以由按鈕來完成,這樣用戶不可能輸入錯誤令。在服務器端,即使是合法令格式也可能是無效令。比如用戶登陸時輸入的賬戶不存在,或此賬戶已,用戶向不存在的賬戶發(fā)送消通過約定好令格式以及嚴格令檢錯機制,本系統(tǒng)在框下 服務器端:服務器在正常情況下應24小時不間斷工作,第一次啟動服務器時,可以從一個保存了所有已用戶信息的txt文檔中數(shù)據(jù),將已用戶信息鏈表初始化然后通過綁定相關端口對客戶端的TCP連接請求進行,一旦有新的TCP連接,服務器會為此用戶分配一個套接字,將收到的消息進行處理,根據(jù)不同令格式,采取不同的操作??蛻舳耍嚎蛻舳碎_始運行后會提示用戶進行登陸或操作。完成后,orks可以方便的分別用來用戶的登陸發(fā)送消息接受消息關閉客戶端其優(yōu)先級不同,關閉客戶端任務優(yōu)先級最高,但一開始其便被阻塞,僅當用戶輸入”tdow”或出錯時才其信號量此任務將關閉其他三個任務同用戶登陸任務首先運行當運行完后其將信號量發(fā)送消息與接收消息任務開始運行。7.xworks本次程序設計的難點是Vxworks的開發(fā)環(huán)境由于是在Vxsim中仿真并沒有到實際的目標板中此次程序設計主體上和在Windows下的CVxworks獨有的特點。Vxworks中Windows優(yōu)先級和對應的信號量,Vxworks的內(nèi)核便可以自動的進行多任務的運行。同時由于是網(wǎng)絡編程,需要建立全功能仿真器環(huán)境。Tornado下默認的ULIP>->”從磁盤安裝接著選擇tornado\host\x86-win32\bin\下的netULIP.inf,ipconfig/all的輸出中可看到多了一個windriverulip;ULIP2配置。在IP欄輸入192.168.255.254(可以是.254,子網(wǎng)掩碼設為NETBIOS用“電腦,選擇“服務,找到“RoutigandRemotes”4表示過的用戶數(shù),dinggaoqiang是用戶名,8888是,用戶名和密碼間有一個空格。并且在 盤新建文件夾F:\Tornado2.2\data_user\messageToSend將已經(jīng)創(chuàng)建好的project文件夾到C盤的Tornado2.2文件夾里。然后通Project10.wpjtornado了。打開project10.wpj的另外法是:打開Tornado,選擇file—Tornado的運打開Tornado之后,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 超簡單的兩人合伙協(xié)議范本
- 小學一年級上學期體育教學工作總結(jié)
- 光的干涉教案
- 項目工程管理策劃書
- 學校輿情信息收集工作制度
- 北師大版《-長方形的面積》大型賽課教學設計
- 2025臨時倉庫租用合同模板
- vr設計制作合同標準文本
- KTV清潔合同樣本
- 災害性天氣應急預案
- 軟件代碼審計與測試作業(yè)指導書
- 上消化道出血護理疑難病例討論記
- 城市軌道交通自動售票機
- 環(huán)境設計專業(yè)考察課程教學大綱
- 2024版互聯(lián)網(wǎng)企業(yè)股東合作協(xié)議書范本3篇
- 企業(yè)環(huán)保知識培訓課件
- 110kV立塔架線安全施工方案
- 完形填空-2025年安徽中考英語總復習專項訓練(含解析)
- 《歲末年初重點行業(yè)領域安全生產(chǎn)提示》專題培訓
- 商混站(商品混凝土公司)安全風險分級管控和隱患排查治理雙體系方案全套資料匯編完整版
- GB/T 16288-2024塑料制品的標志
評論
0/150
提交評論