用NetBIOS会话通信的方式实现简单FTP服务器_第1页
用NetBIOS会话通信的方式实现简单FTP服务器_第2页
用NetBIOS会话通信的方式实现简单FTP服务器_第3页
用NetBIOS会话通信的方式实现简单FTP服务器_第4页
用NetBIOS会话通信的方式实现简单FTP服务器_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、上 海 电 力 学 院基于网络的应用开发课程设计报告(2014/2015学年第一学期)课题名称 用NetBIOS会话通信的方式实现简单FTP服务器 课题号 八 院(系) 电子与信息工程学院 专 业 通信工程 班 级 学 生 王坚 学 号 时 间 2014年12月1日2014年12月5日 一、课程设计任务、简单FTP服务器包括服务器端和客户端,使用NetBIOS实现服务器端和客户端之间的通信,通信方式为会话通信;、简单FTP服务器:只要求实现文件上传功能,文件大小限制自定;、客户端:输入所要上传文件的名称,读入文件的内容并把它发送到服务器;、服务器端:接收数据,并把接收到的数据写入文件;、使用V

2、C6.0的开发环境,构建工程为Win32 Console Application类型。二、基本原理会话是一种面向连接的可靠通信方式。在进行会话通信之前,必须首先建立一个会话连接,客户及利用NCBCALL命令同一个已知的服务建立连接;而服务器则使用NCBLISTEN“侦听”进入的客户机连接。若两个命令中有一个成功,NetBIOS接口便会建立一个会话,并分别为会话双方赋予唯一的会话号。随后,通信双方便可利用该会话号进行会话通信,与数据报相比,会话通信可以确保数据的完整性、抵达顺序以及传输可靠性,等等。下图为会话通信的基本模型从图中不难看出,NetBIOS的会话通信的主要分为如下6个步骤: 初始化。

3、通信双方分别执行NCBRESET命令,复位各自的NetBIOS。 添加名字。为了建立会话,通信双方应在各自的本地名字表中添加唯一名。 建立会话。会话建立过程由服务器和客户机协同完成,服务器方使用NCBLISTEN命令等待客户机的连接请求,客户机使用NCBCALL命令向服务器发起会话连接请求,一旦会话建立成功,双方的NetBIOS将各自返回一个本地会话号,以后通信双方就可使用会话号进行会话通信。 数据传输。会话建立后,双方便可利用NCBSEND和NCBRECV等会话命令进行会话通信。 拆除会话。当数据传输结束时,任何一方均可发出NCBHANGUP命令来拆除指定会话号上的会话连接,以及时释放系统资

4、源。 删除名字。在会话通信进程结束时,双方还应删除各自本地名字表中的名字。三、方案设计在理解会话通信模型的基础上,按照会话程序设计的基本步骤,便能轻松地设计会话通信程序。会话双方用NCBLISTEN/NCBCALL命令得到本地会话号,然后用NCBSEND和NCBRECV等会话命令进行会话通信。服务器端:服务器进程使用NCBLISTEN命令侦听客户进程的连接请求,当客户进程的连接请求到来时,响应并建立会话,随后,服务器进程进入接收等待,每收到一个客户进程发来的数据,便将其显示,然后继续等待接收下一个数据。当客户进程拆除会话时,退出循环,等待下一次的连接请求。客户端:客户进程使用NCBCALL命令

5、向指定服务器发出连接请求,会话建立后,紧接着设置接收。当收到服务器发来的Please input name to send:和Please input message to send:的消息后,用户通过键盘分别输入名称与内容,通过指定的会话链路将所有数据发送到服务器方,等到所有数据传送完,客户进程拆除会话,退出循环,结束本次会话。4、 实验结果五、总结与心得体会通过本次设计我熟悉VC6.0程序的开发环境和NetBIOS的使用。运用VC6.0来完成基于NetBIOS的会话通信方式来实现简单FTP服务器。在这次实验中我开始不是很会这个程序 但是在同组成员的帮助下了解了这个程序 , 结果不是很好但是

6、我在中间收获了很多。6、 附录:实验代码服务器端:#include #include #include #include #include #include #pragma comment(lib,netapi32.lib)#define MAXSESSIONS 254/最大会话数为254#define MAXNAMES 254 /最大名字数为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)/复位特定的网络适配器 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 字节n,buff,strlen(buff); printf(n);SessionSend(&ServerNncb,SessionNum,(UCHAR *)buff,sizeof(buff);continue; elseif (Serv

16、erNncb.ncb_cmd_cplt=0) printf(收到的文件内容是:%s,长度为:%d 字节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/最大回话数为254#define MAX

17、NAMES 254 /最大名字数为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)/复位特定的网络适配器 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; /会话编号 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);/初始化为无效状态、自动恢复为无效状态 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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论