2022年用NetBIOS会话通信的方式实现简单FTP服务器终稿 .pdf
上 海 电 力 学 院基于网络的应用开发课程设计报告(2014/2015 学年第一学期)课题名称用 NetBIOS会话通信的方式实现简单FTP服务器课题号八院(系)电子与信息工程学院专业通信工程班级2011112 学生王坚学号20112246 时间2014 年 12 月 1 日 2014 年 12 月 5 日名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 13 页 -一、课程设计任务、简单 FTP服务器包括服务器端和客户端,使用NetBIOS实现服务器端和客户端之间的通信,通信方式为会话通信;、简单FTP 服务器:只要求实现文件上传功能,文件大小限制自定;、客户端:输入所要上传文件的名称,读入文件的内容并把它发送到服务器;、服务器端:接收数据,并把接收到的数据写入文件;、使用VC6.0 的开发环境,构建工程为Win32 Console Application类型。二、基本原理会话是一种面向连接的可靠通信方式。在进行会话通信之前,必须首先建立一个会话连接,客户及利用NCBCALL 命令同一个已知的服务建立连接;而服务器则使用NCBLISTEN“侦听”进入的客户机连接。若两个命令中有一个成功,NetBIOS接口便会建立一个会话,并分别为会话双方赋予唯一的会话号。随后,通信双方便可利用该会话号进行会话通信,与数据报相比,会话通信可以确保数据的完整性、抵达顺序以及传输可靠性,等等。名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 13 页 -下图为会话通信的基本模型从图中不难看出,NetBIOS的会话通信的主要分为如下6 个步骤:初始化。通信双方分别执行NCBRESET 命令,复位各自的NetBIOS。添加名字。为了建立会话,通信双方应在各自的本地名字表中添加唯一名。建立会话。会话建立过程由服务器和客户机协同完成,服务器方使用 NCBLISTEN 命令等待客户机的连接请求,客户机使用NCBCALL 命令向服务器发起会话连接请求,一旦会话建立成功,双方的 NetBIOS将各自返回一个本地会话号,以后通信双方就可使用会话号进行会话通信。数据传输。会话建立后,双方便可利用 NCBSEND和 NCBRECV等会话命令进行会话通信。拆除会话。当数据传输结束时,任何一方均可发出NCBHANGUP名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 13 页 -命令来拆除指定会话号上的会话连接,以及时释放系统资源。删除名字。在会话通信进程结束时,双方还应删除各自本地名字表中的名字。三、方案设计在理解会话通信模型的基础上,按照会话程序设计的基本步骤,便能轻松地设计会话通信程序。会话双方用NCBLISTEN/NCBCALL命令得到本地会话号,然后用NCBSEND 和 NCBRECV 等会话命令进行会话通信。服务器端:服务器进程使用NCBLISTEN 命令侦听客户进程的连接请求,当客户进程的连接请求到来时,响应并建立会话,随后,服务器进程进入接收等待,每收到一个客户进程发来的数据,便将其显示,然后继续等待接收下一个数据。当客户进程拆除会话时,退出循环,等待下一次的连接请求。客户端:客户进程使用 NCBCALL 命令向指定服务器发出连接请求,会话建立后,紧接着设置接收。当收到服务器发来的Please input name to send:和Please input message to send:的消息后,用户通过键盘分别输入名称与内容,通过指定的会话链路将所有数据发送到服务器方,等到所有数据传送完,客户进程拆除会话,退出循环,结束本次会话。名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 13 页 -四、实验结果名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 13 页 -五、总结与心得体会通过本次设计我熟悉VC6.0程序的开发环境和NetBIOS的使用。运用 VC6.0 来完成基于 NetBIOS的会话通信方式来实现简单FTP服务器。在这次实验中我开始不是很会这个程序但是在同组成员的帮助下了解了这个程序,结果不是很好但是我在中间收获了很多。六、附录:实验代码服务器端:#include#include#include#include#include#include#pragma comment(lib,netapi32.lib)#define MAXSESSIONS 254/最大会话数为254#define MAXNAMES 254 /最大名字数为254 UCHAR 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(&ncb,0,sizeof(ncb);ncb.ncb_command=NCBRESET;ncb.ncb_callname0=MAXNAMES;ncb.ncb_callname2=MAXSESSIONS;ncb.ncb_lana_num=lana;ucRc=Netbios(&ncb);名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 13 页 -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 SessionNum)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_name,SourName);strcpy(char*)pncb-ncb_callname,DestName);pncb-ncb_rto=0;pncb-ncb_sto=5;pncb-ncb_cmd_cplt=0 xff;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_buffer=pBuffer;pncb-ncb_length=Length;Netbios(pncb);名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 13 页 -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=0 xff;pncb-ncb_event=hEvent;/pncb-ncb_lana_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:%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);名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 13 页 -NetbiosListen(&ServerNncb,hEvent,LocalName,*);/侦听客户连接请求;WaitForSingleObject(hEvent,0 xffffffff);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(buff,0,512);SessionRecv(&ServerNncb,SessionNum,hEvent,(UCHAR*)buff);WaitForSingleObject(hEvent,0 xffffffff);/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;else if(ServerNncb.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 名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 13 页 -#include#pragma comment(lib,netapi32.lib)#define MAXSESSIONS 254/最大回话数为254#define MAXNAMES 254 /最大名字数为254 UCHAR 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(&ncb,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.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 SessionNum)NCB ncb;名师资料总结-精品资料欢迎下载-名师精心整理-第 10 页,共 13 页 -UCHAR ucRc;memset(&ncb,0,sizeof(NCB);ncb.ncb_command=NCBHANGUP;ncb.ncb_lsn=SessionNum;ucRc=Netbios(&ncb);return(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,WORD 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=NCBRECV|ASYNCH;pncb-ncb_lsn=Num;pncb-ncb_buffer=pBuffer;pncb-ncb_length=512;pncb-ncb_cmd_cplt=0 xff;pncb-ncb_event=hEvent;Netbios(pncb);int main()NCB ServerNncb;NCB ClientNcb;UCHAR LocalName16;UCHAR NameNum,SessionNum;LANA_ENUM lenum;名师资料总结-精品资料欢迎下载-名师精心整理-第 11 页,共 13 页 -HANDLE hEvent;char buff512;if(Lana_Enum(&lenum)!=NRC_GOODRET)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;SessionNum=ClientNcb.ncb_lsn;/呼叫成功,得到本地会话号 break;SessionRecv(&ClientNcb,SessionNum,hEvent,(UCHAR*)buff,lenum.lana0);/收到数据,事件触发 WaitForSingleObject(hEvent,0 xffffffff);/等待服务器发来欢迎消息 printf(buff);printf(n);for(;)printf(Please input name to send:);memset(buff,0,512);名师资料总结-精品资料欢迎下载-名师精心整理-第 12 页,共 13 页 -scanf(%s,buff);if(strcmp(buff,exit)=0)break;printf(Please input message to send:);memset(buff,0,512);scanf(%s,buff);if(strcmp(buff,exit)=0)break;SessionSend(&ClientNcb,SessionNum,(UCHAR*)buff,strlen(buff),lenum.lana0);/会话发送 memset(buff,0,512);SessionRecv(&ServerNncb,SessionNum,hEvent,(UCHAR*)buff,lenum.lana0);WaitForSingleObject(hEvent,0 xffffffff);printf(%s n,buff);printf(n);memset(buff,0,512);continue;printf(%s n,buff);printf(n);memset(buff,0,512);continue;/实际要发送的字节数 HangupSession(SessionNum);/拆除会话 return 0;名师资料总结-精品资料欢迎下载-名师精心整理-第 13 页,共 13 页 -