实验四SOCKET编程实现简单FTP程序
1.实验目的
(1)掌握网络应用程序的开发方法;
(2)掌握Client/ Server结构软件的设计与开发方法 (3)掌握Socket机制的工作原理 2.实验准备
(1)阅读关于TCP/IP协议和Socket的相关内容; (2)阅读WinSock编程指南; (3)VC++6.0/DELPHI7.0/C#开发工具 3.实验内容
使用Win32 Socket 函数实现mini FTP client/ Server:在客户端实现GET file, PUT file, CD( change Directory), PWD( display current directory in server)功能。 4.实验报告
(1)按实验内容进行软件编制和调试 (2)进行功能测试,记录测试步骤 (3)给出程序主要部分流程图
数据同步传输系统既适合于服务器端的目录遍历,又适合客户端对服务端的上传文件和下载文件。运用Socket(套接字)接口和使用 FTP(文件传输协议)来实现客户端和服务器端之间信息的交互。该数据传输平台分为两个模块:服务器端模块和客户端模块。客户服务器程序通过对编程语言 Visual C++6.0中的
调用来实现利用TCP/IP协议中的 FTP协议和封装在NMFTP 内的Socket 接口进行客户端与服务器连接,并完成数据同步工作,例如:上传、下载、浏览、查询、对服务器目录与文件的管理以及执行远程命令等。
服务器端程序则持续的监听网络。当接受到客户端的Socket ,服务器程序提供相应的服务。网络通信模块使用POP3 控件来实现客户端与服务器的信息交流。
函数功能和流程如下:(1)首先创建一个CFtpclient的类的实例。
(2)用LogOnToServer()函数登录到指定的FTP服务器,允许非匿名用户和匿名两种登录方式,默认的端口为21.
(3)使用MoveFile()函数来上传下载数据文件,其中第一个参数是本地地址,第二个参数是远程地址,文件传输选用二进制模式。注意,文件传输使用同步模式。
(4)可以使用Ftpcommand()函数来执行FTP指令,包括常用的“CWD/home/mydir”来改变远程服务器上的地址,并处理服务器返回的应答。当这种方式不适用的时候,还可以使用WriteStr()函数和ReadStr()函数向远程服务器发送指令,并自己解释返回的应答。
(5)当所有的文件传输完成之后,使用LogOffServer函数来断开与远程服务器的连接。
(一)FTP客户端的主要代码
1.头文件
#include \#include \#ifdef _DEBUG #undef THIS_FILE
static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif
2.创建ParseLine()函数
BOOL CListItem::ParseLine(CString strLine) {
if(strLine.IsEmpty()) return FALSE;
char ch = strLine.GetAt(0); if(ch == 'd' || ch == 'D'){ m_bDirectory = TRUE; } else
if(ch == '-')
m_bDirectory = FALSE; else{
if(strLine.Find(\
-1)
m_bDirectory = TRUE; else
m_bDirectory = FALSE; if(strLine.GetLength() < 40) return FALSE;
m_strName = strLine.Mid(39); m_strDate = strLine.Left(18); m_strName.TrimLeft(); m_strName.TrimRight(); return TRUE; }
m_bSec = 0;
for(int i = 0; i < 9; i++){ ch = strLine.GetAt(i); if(ch == '-')
m_bSec |= 0x01; m_bSec <<= 1; }
m_strSec = strLine.Mid(1, 9); int ndx = strLine.Find(':'); if(ndx == -1){
if(strLine.GetLength() > 56) ndx = 51; else
return FALSE; }
m_index = ndx;
m_strName = strLine.Mid(ndx + 3); m_strName.TrimLeft(); m_strName.TrimRight();
m_strDate = strLine.Mid(ndx - 9, 12); return TRUE; }
(二)客户端运行后的界面
图2
上面的图是运行后在修改了用户名和密码,查出所需要的文件的I盘和文件名。客户端运行后看到的的服务器端地址是所用电脑的
(三)FTP服务器端代码
1.Socket编程中的Server()函数
UINT ServerThread(LPVOID lpParameter) { SOCKET sListen, sAccept; SOCKADDR_IN inetAddr; DWORD dwFlags; DWORD dwRecvBytes; CServer * server =(CServer*)lpParameter;
2.创建第一个手动重置对象
if ((g_events[0] = WSACreateEvent()) == WSA_INVALID_EVENT) {
printf(\错误:WSACreateEvent failed with error %d\\n\ return 0; }
3. 创建一个线程处理请求
AfxBeginThread(ProcessTreadIO,(LPVOID)server);
if (CreateThread(NULL, 0, ProcessTreadIO,(void*)server, 0, &dwThreadId) == NULL) {
printf(\错误:CreateThread failed with error %d\\n\ return 0; }
g_dwEventTotal = 1; while(!server->m_bStop) {
//处理入站连接
if ((sAccept = accept(sListen, NULL, NULL)) == INVALID_SOCKET) {
printf(\错误:accept failed with error %d\\n\ return 0;