1、FTP模型
FTP协议是基于TCP/IP协议的应用层协议之一,在实际运行中,它使用两个TCP连接来完成文件传输操作,这两个TCP连接分别是控制连接和数据连接。在整个FTP处理过程中,控制连接起传输控制信息的作用,它始终保持主动状态。用户需求的数据是通过数据连接来传输的。
2、应用WinSock实现网络通信
WinSock是Microsoft等公司联合开发的网络编程接口,其实是一种进程间相互通信的机制,并将这种进程间通信从单机环境扩展到网络环境,适合于开发主机/客户机通信程序。网络通信包括两台主机或者两个进程通过网络传递数据,网络的每一端称为一个端点,而WinSock为网络端点的抽象表T。当用其编程时,程序在网络对话的每端都需要一个Socket,两个Socket之间可以应用面向连接的或者是无连接的网络协议。
面向连接的协议通过互换确认信息在连接端口之间建立一条虚电路,它不必关心网络软件传送数据。因而面向连接的客户程序不必指定本地协议端口,而只需为Socket提供远程主机信息;IP地址和协议端口,WinSock可自动保存本地IP地址和选择本地端口。
面向连接的WinSock客户机/服务器模型,服务器在没有请求到达时,它处于等待状态。一旦请求到来,服务器立即产生一个子进程,然后回到等待状态,由子进程相应请求。当下一个请求到达时,服务器再产生一个新进程。其中,并发服务器成为主服务器,子进程称为从服务器。这种主从服务器的方式巧妙地解决了并发请求问题。
3、程序功能
客户机/服务器方式的服务器方的源程序为NET,用VC+ +6.0编写而成。其功能是实现服务通信功能,允许多个客户连接,响应客户请求,发送文本文件。为了解、熟悉通信过程,依据通信过程设定了菜单栏,即开始连接(侦听)、发送接收数据。服务器编程后,客户端编程可以借用,因此较简单,客户端程序为Net-Client,可以连接服务器,接收数据。测试时首先启动服务器程序,等待客户连接,建立连接后可发送文本文件,结果无误。
标准的FTP协议,功能丰富,在这里着重于客户机/服务器模型的实现,编程实现其最基本的功能建立连接及文件传输。
3.1、总体设计
模块划分
(1)侦听、建立连接模块:CListenSocket} CReceiveSocket
(2)交换消息模块:CMsg
(3)处理连接请求,发送接收数据模块:CNetView
实现方案
(1)编写交换信息类,即信息内容类CMsg,使用Cobject作为基类,用于确定客户和服务器交换信息的格式和内容,其头文件为msg. h,代码文件为msg. h内音日包含如下过程:
CMsg();构造函数
一CMsg( );析构函数
void Init( );初始化函数
void Serialize(Carchive& ar); CMsg序列化函数
Void AssertValid()const;
Void Dump ( CdumpContext& do ) const; CMsg诊断函数
通信交换信息头文件Commun. h中描述了通信双方的应答信息,包括连接信息和文件发送状态信息:
(2)初始化WinSock库
在调用WinSock前,必须初始化WinSock库。由CnetView的消息映射函数OnInitialUpdate)完成,其中WSAStartup函数用于初始化WinSock. dll,检索WinSock执行体信息,通知WinSock分配程序所需的网络资源,指定要求的WinSock版本,它必须与WSACIeanUp成对使用。WSACIeanUp通知WinSock释放程序所需要网络资源,发送剩余数据,关闭套接字后中断连接。
(3) CSoket类
以CSoket类为基类建立两个类:
(a)侦听类ClistenSocket,用于侦听和响应用户的连接请求,建立虚电路。
主要成员如下:
ClistenSocket ( CnetView*pView);
构造函数;
这样侦听类ClistenSocket即可调用视图类的公共成员。
Void OnAccept();
(b)数据接收类CreceiveSocket,用于与用户通信,接收用户信息和发送给用户信息。
主要成员如下:
CReceiveSocket(CnetView*pView)
构造函数;
~CReceiveSocket()
析构函数;
void Initialize()
初始化函数,实现数据接口的初始化工作;
void OnRecieve()
接收数据回调函数;
void SendMsg(CMsg*pMsg)
发送数据函数;
void ReceiveMsg(CMsg*pMsg)
接收数据函数;
void Abort()
关闭套接字的接收功能的函数
(4 ) CNetView,处理连接请求,接收发送数据及多客户连接等。
void OnNetServerstar()
“开始侦听”,菜单项命令映射函数,
功能为开始侦听连接请求,等候客户连接。
在网络环境中,进程之间通信首先要解决进程标识问题。
Dlg InputPort. M_nInPort必须与客户端输入的端口号一致,它用于唯一标志通信进程。
void OnUpdateNetServerstart(CcmdUI*pCmdUI)
“开始侦听”,菜单项的更新用户界面函数。
void OnListenAccept(WPARAM wParam}LPARAM lparam)
处理已响应客户的连接请求的函数。
void OnNetSendData()
发送数据’,菜单项命令映射函数,为客户发送文件。
void SendFile(pp Socket)
文件发送函数。
void OnUpdateNetSenddata ( CcmdUI*pCmdUI)
“发送数据”,菜单项的更新用户界面函数。
void ReceiveData(CReceiveSocket*pSocket)
接收客户数据函数。
CloseSocket(CReceiveSocket*pSocket)
处理客户退出事件的函数。
void OnDestroy()
处理服务器关闭的退出函数。
void OnDraw(CDC*pDC)
显示服务器、客户交换信息的函数。
void OnPrepareDC(CDC*pDC, CPrintInfo*pInfo)
设置显示设备环境。
部分程序
(1)建立Socket对象
Csocket*pSocket=new(Socket);
if(!pSocket Creat())
{
delete pSocket;
messageBox("Create Object Error!”,ErrorInfo", MB OIL);
return NULL;
}
(2)建立连接
Server端:
(Socket *m_pListenSocket=new(Socket);
if(m_pListenSocket Create(8050))
{
if(!m_pListenSocket Listen())
{
messageBos(“Port Error!”,”ErrorInfo”,MB_OK);
}
}
Client端:
if(!pSocket Connect(“127.0.0.1”,8050))
{
Delete pSocket;
messageBox(“Connect Server Error!”,”ErrorInfo”,MB_OK);
return NULL;
}
(3)发送和接受数据
pSocket send(Sendmsg strlen(send(msg));
ByteConunt=pSocket Receive(Revmsg,1000);
(4)删除Csocket对象
If(m_pSocket)
{
Delete pSocket;
pSoclet=NULL;
}
Else {
messageBox(Connection is not exist!”,”ErrorInfo”,MK_OK);
}
原文来自:《基于FTP协议的WinSock程序实现》顾斌