用NetBIOS會(huì)話通信的方式實(shí)現(xiàn)簡單FTP服務(wù)器_第1頁
用NetBIOS會(huì)話通信的方式實(shí)現(xiàn)簡單FTP服務(wù)器_第2頁
用NetBIOS會(huì)話通信的方式實(shí)現(xiàn)簡單FTP服務(wù)器_第3頁
用NetBIOS會(huì)話通信的方式實(shí)現(xiàn)簡單FTP服務(wù)器_第4頁
用NetBIOS會(huì)話通信的方式實(shí)現(xiàn)簡單FTP服務(wù)器_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、上 海 電 力 學(xué) 院基于網(wǎng)絡(luò)的應(yīng)用開發(fā)課程設(shè)計(jì)報(bào)告(2014/2015學(xué)年第一學(xué)期)課題名稱 用NetBIOS會(huì)話通信的方式實(shí)現(xiàn)簡單FTP服務(wù)器 課題號 八 院(系) 電子與信息工程學(xué)院 專 業(yè) 通信工程 班 級 學(xué) 生 王堅(jiān) 學(xué) 號 時(shí) 間 2014年12月1日2014年12月5日 一、課程設(shè)計(jì)任務(wù)、簡單FTP服務(wù)器包括服務(wù)器端和客戶端,使用NetBIOS實(shí)現(xiàn)服務(wù)器端和客戶端之間的通信,通信方式為會(huì)話通信;、簡單FTP服務(wù)器:只要求實(shí)現(xiàn)文件上傳功能,文件大小限制自定;、客戶端:輸入所要上傳文件的名稱,讀入文件的內(nèi)容并把它發(fā)送到服務(wù)器;、服務(wù)器端:接收數(shù)據(jù),并把接收到的數(shù)據(jù)寫入文件;、使用V

2、C6.0的開發(fā)環(huán)境,構(gòu)建工程為Win32 Console Application類型。二、基本原理會(huì)話是一種面向連接的可靠通信方式。在進(jìn)行會(huì)話通信之前,必須首先建立一個(gè)會(huì)話連接,客戶及利用NCBCALL命令同一個(gè)已知的服務(wù)建立連接;而服務(wù)器則使用NCBLISTEN“偵聽”進(jìn)入的客戶機(jī)連接。若兩個(gè)命令中有一個(gè)成功,NetBIOS接口便會(huì)建立一個(gè)會(huì)話,并分別為會(huì)話雙方賦予唯一的會(huì)話號。隨后,通信雙方便可利用該會(huì)話號進(jìn)行會(huì)話通信,與數(shù)據(jù)報(bào)相比,會(huì)話通信可以確保數(shù)據(jù)的完整性、抵達(dá)順序以及傳輸可靠性,等等。下圖為會(huì)話通信的基本模型從圖中不難看出,NetBIOS的會(huì)話通信的主要分為如下6個(gè)步驟: 初始化。

3、通信雙方分別執(zhí)行NCBRESET命令,復(fù)位各自的NetBIOS。 添加名字。為了建立會(huì)話,通信雙方應(yīng)在各自的本地名字表中添加唯一名。 建立會(huì)話。會(huì)話建立過程由服務(wù)器和客戶機(jī)協(xié)同完成,服務(wù)器方使用NCBLISTEN命令等待客戶機(jī)的連接請求,客戶機(jī)使用NCBCALL命令向服務(wù)器發(fā)起會(huì)話連接請求,一旦會(huì)話建立成功,雙方的NetBIOS將各自返回一個(gè)本地會(huì)話號,以后通信雙方就可使用會(huì)話號進(jìn)行會(huì)話通信。 數(shù)據(jù)傳輸。會(huì)話建立后,雙方便可利用NCBSEND和NCBRECV等會(huì)話命令進(jìn)行會(huì)話通信。 拆除會(huì)話。當(dāng)數(shù)據(jù)傳輸結(jié)束時(shí),任何一方均可發(fā)出NCBHANGUP命令來拆除指定會(huì)話號上的會(huì)話連接,以及時(shí)釋放系統(tǒng)資

4、源。 刪除名字。在會(huì)話通信進(jìn)程結(jié)束時(shí),雙方還應(yīng)刪除各自本地名字表中的名字。三、方案設(shè)計(jì)在理解會(huì)話通信模型的基礎(chǔ)上,按照會(huì)話程序設(shè)計(jì)的基本步驟,便能輕松地設(shè)計(jì)會(huì)話通信程序。會(huì)話雙方用NCBLISTEN/NCBCALL命令得到本地會(huì)話號,然后用NCBSEND和NCBRECV等會(huì)話命令進(jìn)行會(huì)話通信。服務(wù)器端:服務(wù)器進(jìn)程使用NCBLISTEN命令偵聽客戶進(jìn)程的連接請求,當(dāng)客戶進(jìn)程的連接請求到來時(shí),響應(yīng)并建立會(huì)話,隨后,服務(wù)器進(jìn)程進(jìn)入接收等待,每收到一個(gè)客戶進(jìn)程發(fā)來的數(shù)據(jù),便將其顯示,然后繼續(xù)等待接收下一個(gè)數(shù)據(jù)。當(dāng)客戶進(jìn)程拆除會(huì)話時(shí),退出循環(huán),等待下一次的連接請求。客戶端:客戶進(jìn)程使用NCBCALL命令

5、向指定服務(wù)器發(fā)出連接請求,會(huì)話建立后,緊接著設(shè)置接收。當(dāng)收到服務(wù)器發(fā)來的Please input name to send:和Please input message to send:的消息后,用戶通過鍵盤分別輸入名稱與內(nèi)容,通過指定的會(huì)話鏈路將所有數(shù)據(jù)發(fā)送到服務(wù)器方,等到所有數(shù)據(jù)傳送完,客戶進(jìn)程拆除會(huì)話,退出循環(huán),結(jié)束本次會(huì)話。4、 實(shí)驗(yàn)結(jié)果五、總結(jié)與心得體會(huì)通過本次設(shè)計(jì)我熟悉VC6.0程序的開發(fā)環(huán)境和NetBIOS的使用。運(yùn)用VC6.0來完成基于NetBIOS的會(huì)話通信方式來實(shí)現(xiàn)簡單FTP服務(wù)器。在這次實(shí)驗(yàn)中我開始不是很會(huì)這個(gè)程序 但是在同組成員的幫助下了解了這個(gè)程序 , 結(jié)果不是很好但是

6、我在中間收獲了很多。6、 附錄:實(shí)驗(yàn)代碼服務(wù)器端:#include #include #include #include #include #include #pragma comment(lib,netapi32.lib)#define MAXSESSIONS 254/最大會(huì)話數(shù)為254#define MAXNAMES 254 /最大名字?jǐn)?shù)為254UCHAR Lana_Enum(LANA_ENUM *lenum)/獲取可用lana NCB ncb; UCHAR ucRc; memset(&ncb,0,sizeof(NCB); ncb.ncb_command=NCBENUM; ncb.ncb_

7、buffer=(PUCHAR)lenum; ncb.ncb_length=sizeof(LANA_ENUM); ucRc=Netbios(&ncb); return(ucRc);UCHAR RestNCB(UCHAR lana)/復(fù)位特定的網(wǎng)絡(luò)適配器 NCB ncb; UCHAR ucRc; memset(&ncb,0,sizeof(ncb); ncb.ncb_command=NCBRESET; ncb.ncb_callname0=MAXNAMES; ncb.ncb_callname2=MAXSESSIONS; ncb.ncb_lana_num=lana; ucRc=Netbios(&ncb)

8、; return(ucRc);UCHAR AddName(CHAR *Name,UCHAR *NameNum,UCHAR lana)/添加名字 NCB ncb; /LANA_ENUM lenum; memset(&ncb,0,sizeof(NCB); ncb.ncb_command=NCBADDNAME; ncb.ncb_lana_num=lana; strcpy(char*)ncb.ncb_name,Name); Netbios(&ncb); *NameNum=ncb.ncb_num; return(ncb.ncb_cmd_cplt);UCHAR HangupSession(UCHAR Se

9、ssionNum) NCB ncb; UCHAR ucRc; memset(&ncb,0,sizeof(NCB); ncb.ncb_command=NCBHANGUP; ncb.ncb_lsn=SessionNum; ucRc=Netbios(&ncb); return(ucRc);void NetbiosListen(PNCB pncb,HANDLE hEvent,CHAR SourName,CHAR DestName) memset(pncb,0,sizeof(NCB); pncb-ncb_command=NCBLISTEN|ASYNCH; strcpy(char *)pncb-ncb_n

10、ame,SourName); strcpy(char *)pncb-ncb_callname,DestName); pncb-ncb_rto=0; pncb-ncb_sto=5; pncb-ncb_cmd_cplt=0xff; pncb-ncb_event=hEvent; Netbios(pncb);void SessionSend(PNCB pncb,UCHAR Num,UCHAR *pBuffer,WORD Length) memset(pncb,0,sizeof(NCB); pncb-ncb_command=NCBSEND; pncb-ncb_lsn=Num; pncb-ncb_buff

11、er=pBuffer; pncb-ncb_length=Length; Netbios(pncb);void SessionRecv(PNCB pncb,UCHAR Num,HANDLE hEvent,UCHAR *pBuffer) memset(pncb,0,sizeof(NCB); pncb-ncb_command=NCBRECV|ASYNCH; pncb-ncb_lsn=Num; pncb-ncb_buffer=pBuffer; pncb-ncb_length=512; pncb-ncb_cmd_cplt=0xff; pncb-ncb_event=hEvent;/pncb-ncb_lan

12、a_num=lana; Netbios(pncb);int main() NCB ServerNncb; UCHAR LocalName16; UCHAR NameNum,SessionNum; HANDLE hEvent; LANA_ENUM lenum; char buff512; if (Lana_Enum(&lenum)!=NRC_GOODRET) printf(LanaEnum Error!n); return 0; if (RestNCB(lenum.lana0)!=0)printf(Reset NCB FALSE!n);return 0;printf(Lana_num is: %

13、dn,lenum.lana0);printf(Reset NCB OK!n);strcpy(LocalName,Server);if (AddName(LocalName,&NameNum,lenum.lana0)return 0;printf(Add Name OK!n);hEvent=CreateEvent(NULL,FALSE,FALSE,Server);if (hEvent=NULL)return 0;printf(Create Event OK!n);for(;)printf(READY ! n);NetbiosListen(&ServerNncb,hEvent,LocalName,

14、*);/偵聽客戶連接請求;WaitForSingleObject(hEvent,0xffffffff);if (ServerNncb.ncb_cmd_cplt!=0) return 0; printf(Listen OK!n); SessionNum=ServerNncb.ncb_lsn;printf(SessionNum is:%dn,ServerNncb.ncb_lsn); strcpy(buff,Welcome to Server!n); SessionSend(&ServerNncb,SessionNum,(UCHAR *)buff,sizeof(buff); for(;)memset

15、(buff,0,512); SessionRecv(&ServerNncb,SessionNum,hEvent,(UCHAR*)buff); WaitForSingleObject(hEvent,0xffffffff);/printf(Recv:); if (ServerNncb.ncb_cmd_cplt=0) printf(收到的文件名字是:%s,長度為:%d 字節(jié)n,buff,strlen(buff); printf(n);SessionSend(&ServerNncb,SessionNum,(UCHAR *)buff,sizeof(buff);continue; elseif (Serv

16、erNncb.ncb_cmd_cplt=0) printf(收到的文件內(nèi)容是:%s,長度為:%d 字節(jié)n,buff,strlen(buff); printf(n);SessionSend(&ServerNncb,SessionNum,(UCHAR *)buff,sizeof(buff);continue; else break;客戶端:#include #include #include #include #include #include #pragma comment(lib,netapi32.lib)#define MAXSESSIONS 254/最大回話數(shù)為254#define MAX

17、NAMES 254 /最大名字?jǐn)?shù)為254UCHAR Lana_Enum(LANA_ENUM *lenum)/獲取可用lana NCB ncb; UCHAR ucRc; memset(&ncb,0,sizeof(NCB); ncb.ncb_command=NCBENUM; ncb.ncb_buffer=(PUCHAR)lenum; ncb.ncb_length=sizeof(LANA_ENUM); ucRc=Netbios(&ncb); return(ucRc);UCHAR RestNCB(UCHAR lana)/復(fù)位特定的網(wǎng)絡(luò)適配器 NCB ncb; UCHAR ucRc; memset(&n

18、cb,0,sizeof(NCB); ncb.ncb_command=NCBRESET; ncb.ncb_callname0=MAXSESSIONS; ncb.ncb_callname2=MAXNAMES; ncb.ncb_callname3=TRUE; ncb.ncb_lana_num=lana; ucRc=Netbios(&ncb); return(ucRc);UCHAR AddName(UCHAR *Name,UCHAR *NameNum,UCHAR lana)/添加名字 NCB ncb; LANA_ENUM lenum; memset(&ncb,0,sizeof(NCB); ncb.nc

19、b_command=NCBADDNAME; ncb.ncb_lana_num=lana; strcpy(char*)ncb.ncb_name,Name); Netbios(&ncb); *NameNum=ncb.ncb_num; return(ncb.ncb_cmd_cplt);UCHAR HangupSession(UCHAR SessionNum) NCB ncb; UCHAR ucRc; memset(&ncb,0,sizeof(NCB); ncb.ncb_command=NCBHANGUP; ncb.ncb_lsn=SessionNum; ucRc=Netbios(&ncb); ret

20、urn(ucRc);UCHAR NetbiosCall(PNCB pncb,CHAR SourName,CHAR DestName) memset(pncb,0,sizeof(NCB); pncb-ncb_command=NCBCALL; strcpy(char*)pncb-ncb_name,SourName); strcpy(char*)pncb-ncb_callname,DestName); pncb-ncb_rto=0; pncb-ncb_sto=10; Netbios(pncb);void SessionSend(PNCB pncb,UCHAR Num,UCHAR *pBuffer,W

21、ORD Length,UCHAR lana) memset(pncb,0,sizeof(NCB); pncb-ncb_command=NCBSEND; pncb-ncb_lsn=Num; /會(huì)話編號 pncb-ncb_buffer=pBuffer; pncb-ncb_length=Length;pncb-ncb_lana_num=lana; Netbios(pncb);void SessionRecv(PNCB pncb,UCHAR Num,HANDLE hEvent,UCHAR *pBuffer) memset(pncb,0,sizeof(NCB); pncb-ncb_command=NCB

22、RECV|ASYNCH; pncb-ncb_lsn=Num; pncb-ncb_buffer=pBuffer; pncb-ncb_length=512; pncb-ncb_cmd_cplt=0xff; pncb-ncb_event=hEvent; Netbios(pncb);int main() NCB ServerNncb; NCB ClientNcb; UCHAR LocalName16; UCHAR NameNum,SessionNum; LANA_ENUM lenum; HANDLE hEvent; char buff512; if (Lana_Enum(&lenum)!=NRC_GO

23、ODRET) printf(LanaEnum Error!n); return; printf(Lana_num is: %dn,lenum.lana0); if (RestNCB(lenum.lana0)!=0) printf(ResetNcb Error!);return; printf(Reset NCB OK!n); strcpy(LocalName,Client); if (AddName(LocalName,&NameNum,lenum.lana0) return 0; printf(Add Name OK!n); hEvent=CreateEvent(NULL,FALSE,FALSE,Client);/初始化為無效狀態(tài)、自動(dòng)恢復(fù)為無效狀態(tài) if(hEvent=NULL) return 0; printf(Create Event OK!n); printf(CALL.n); for(;) NetbiosCall(&ClientNcb,LocalName,Server); if (ClientNcb.ncb_cmd_cplt!=0) printf(CALL.n); continue; Sess

溫馨提示

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

評論

0/150

提交評論