当前位置:文档之家› 文件传输协议的(C语言)实现

文件传输协议的(C语言)实现

课程设计:FTP的设计与实现

一、目的

Internet提供了很多类型的网络服务,这些服务实际上都是应用层的服务。FTP服务是基于TCP协议的网络服务。

文件传送是各种计算机网络都实现的基本功能,文件传送协议是一种最基本的应用层协议。通过完成一个文件传送协议FTP的实现,学会利用已有网络环境设计并实现简单应用层协议,掌握TCP/IP网络应用程序基本的设计方法和实现技巧。

二、内容和要求

每两人一组,分别实现FTP协议客户端程序和服务器程序。

客户端程序具有文件列表、下载文件、上传文件等常用功能。服务器程序支持改变工作目录、文件列表、下载文件等常用的服务。

因为FTP协议比较复杂,为了简单起见,客户端只实现FTP客户端协议的一个子集,总的来说有以下几个功能:

●连接到指定的FTP服务器;

●断开和主机的连接;

●进入子目录;

●退出子目录;

●列出服务器当前目录下的所有文件

●从服务器下载指定的文件到本地(可以同时指定多个文件连续下载)

●从本地上传指定的文件到服务器

实现以上几个功能时会涉及到下面的几个FTP命令:

●USER username

●PASS password

●CWD directory-name

●PORT host-port

●TYPE A or I

●RETR filename

●STOR filename

●LIST directory

用户界面应该能够为程序输入下面的信息:

●服务器主机名

●用户名、口令

●数据的传送类型

●要进入的服务器目录

●要下载的远程文件名

●要上载的本地文件名和远程文件名

同时,界面也为用户输出以下的信息:

●FTP服务器上的文件和目录列表

●从服务器返回的应答

使用Socket进行Client/Server程序设计的一般连接过程是这样的:Server端Listen(监听)某个端口是否有连接请求,Client端向Server端发出Connect(连接)请求,Server端向Client端发回Accept(接受)消息。一个连接就建立起来了。Server端和Client端都可以通过Send,Write等方法与对方通信。

对于一个功能齐全的Socket,都要包含以下基本结构,其工作过程包含以下四个基本的步骤:

(1)创建Socket;

(2)打开连接到Socket的输入/出流;

(3)按照一定的协议对Socket进行读/写操作;

(4)关闭Socket.

第三步是程序员用来调用Socket和实现程序功能的关键步骤,其他三步在各种程序中基本相同。

/****************client.c****************/

#include

#include

#include

#pragma comment(lib,"ws2_32.lib")

#define DEFAULT_PORT 2302

#define DEFAULT_BUFFER 2048

#define DEFAULT_MESSAGE "This is a test of the emergency \ broadcasting system"

char szServerip[128], // Server to connect to

szMessage[1024]; // Message to send to sever

int iPort = DEFAULT_PORT; // Port on server to connect to

//DWORD dwCount = DEFAULT_COUNT; // Number of times to send message

BOOL bSendOnly = FALSE; // Send data only; don't receive

int dirfun();

int getfun();

int putfun();

int pwdfun();

int cdfun();

int mdfun();

int delfun();

int usafun();

void usage()

{

printf("usage: client [-p:x] [-s:IP] [-n:x] [-o]\n\n");

printf(" -p:x Remote port to send to\n");

printf(" -s:IP Server's IP address or hostname\n");

printf(" -n:x Number of times to send message\n");

printf(" -o Send messages only; don't receive\n");

ExitProcess(1);

}

void ValidateArgs(int argc, char **argv)

{

int i;

for(i = 1; i < argc; i++)

{

if ((argv[i][0] == '-') || (argv[i][0] == '/'))

{

switch (tolower(argv[i][1]))

{

case 'p': // Remote port

if (strlen(argv[i]) > 3)

iPort = atoi(&argv[i][3]);

break;

case 's': // Server

if (strlen(argv[i]) > 3)

strcpy(szServerip, &argv[i][3]);

break;

case 'n': // Number of times to send message

if (strlen(argv[i]) > 3)

//dwCount = atol(&argv[i][3]);

break;

case 'o': // Only send message; don't receive

bSendOnly = TRUE;

break;

default:

usage();

相关主题