ftp服务器的简单实现——客户端

Posted 众生皆苦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ftp服务器的简单实现——客户端相关的知识,希望对你有一定的参考价值。

客户端:

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>

#define TRUE 1
#define dataLen 1024
char user_cmd[10], cmd_arg[20];
char buf[dataLen];

void cmd_pwd(int sock, int sockmsg);
void cmd_dir(int sock, int sockmsg);
void cmd_cd(int sock, int sockmsg, char *dirName);
void cmd_cdback(int sock, int sockmsg);
void cmd_help(int sock, int sockmsg);
void cmd_get(int sock, int sockmsg, char *fileName);
void cmd_put(int sock, int sockmsg, char *fileName);
void cmd_quit(int sock, int sockmsg);

int main(int argc, char *argv[])
{
	int cmd_len, arg_len;
	int sock, sockmsg;
	struct sockaddr_in server, servermsg;
	struct hostent *hp;

	sock = socket(AF_INET, SOCK_STREAM, 0);
	sockmsg = socket(AF_INET, SOCK_STREAM, 0);
	
	if(sock < 0 || sockmsg < 0)
	{
		perror("opening stream socket");
		exit(1);
	}

	printf("argc is %d, argv[1] is %s\n",argc, argv[1]);

	hp = gethostbyname(argv[1]);
	//hp = gethostbyname("localhost");
	if(hp == 0)
	{
		fprintf(stderr, "%s:unknown host\n", argv[1]);
		exit(2);
	}

	server.sin_family = AF_INET;
	server.sin_port = htons(atoi(argv[2]));
	memcpy((char*)&server.sin_addr, (char*)hp->h_addr, hp->h_length);
	
	servermsg.sin_family = AF_INET;
	servermsg.sin_port = htons(atoi(argv[2]) +1);
	memcpy((char*)&servermsg.sin_addr, (char*)hp->h_addr, hp->h_length);

	if(connect(sock, (struct sockaddr *)&server, sizeof(server)) < 0 ||
		connect(sockmsg, (struct sockaddr *)&servermsg, sizeof(servermsg)) < 0)
	{
		perror("connecting stream socket");
		exit(1);
	}

	while(TRUE)
	{
		memset(user_cmd, 0, 10);
		memset(cmd_arg, 0, 20);

		//First get the input character by user
		printf("command: ");
		scanf("%s", user_cmd);

		//Then get the command charater and argument
		if(strcmp(user_cmd, "quit") == 0)
		{
			cmd_quit(sock, sockmsg);
			close(sockmsg);
			close(sock);
			printf("connection closed\n\n");
			exit(0);
		}
		else if(strcmp(user_cmd, "?") == 0)
		{
			cmd_help(sock, sockmsg);
		}
		else if(strcmp(user_cmd, "pwd") == 0)
		{
			printf("stcmp pwd --------------->>>\n");
			cmd_pwd(sock, sockmsg);
		}
		else if(strcmp(user_cmd, "dir") == 0)
		{
			cmd_dir(sock, sockmsg);
		}
		else if(strcmp(user_cmd, "cd") == 0)
		{
			scanf("%s", cmd_arg);
			cmd_cd(sock, sockmsg, cmd_arg);
		}
		else if(strcmp(user_cmd, "cd..") == 0)
		{
			cmd_cdback(sock, sockmsg);
		}
		else if(strcmp(user_cmd, "get") == 0 )
		{
			scanf("%s", cmd_arg);
			cmd_get(sock, sockmsg, cmd_arg);
		}
		else if(strcmp(user_cmd, "put") == 0)
		{
			scanf("%s", cmd_arg);
			cmd_put(sock, sockmsg, cmd_arg);
		}
		else
		{
			printf("bad command!\n");
		}
	}
}


void cmd_pwd(int sock, int sockmsg)
{
	//int numRead
	char dirName[30];
	write(sockmsg, user_cmd, sizeof(user_cmd));
	read(sock, dirName, 30);
	printf("dirName is ------->>  %s\n", dirName);
}

//command dir
void cmd_dir(int sock, int sockmsg)
{
	int i, fileNum = 0;
	char fileInfo[50];

	write(sockmsg, user_cmd, sizeof(user_cmd));
	read(sock, &fileNum, sizeof(int));

	printf("---------------------------------------\n");
	printf("file number : %d\n", fileNum);
	if(fileNum > 0)
	{
		for(i=0; i<fileNum; i++)
		{
			memset(fileInfo, 0, sizeof(fileInfo));
			read(sock, fileInfo, sizeof(fileInfo));
			printf("%s\n", fileInfo);
		}
		printf("-----------------------------------\n");
	}
	else if(fileNum == 0)
	{
		printf("directory of server point is empty.\n");
		return;
	}
	else
	{
		printf("error in command ‘dir‘\n");
		return;
	}
} 

void cmd_cd(int sock, int sockmsg, char *dirName)
{
	char currentDirPath[200];
	write(sockmsg, user_cmd, sizeof(user_cmd));
	write(sockmsg, cmd_arg, sizeof(cmd_arg));
	printf("172 ----------->>\n");
	read(sock, currentDirPath, sizeof(currentDirPath));
	printf("174 ------------>>\n");
	printf("now is directory : %s\n", currentDirPath);
}

//command cd..
void cmd_cdback(int sock, int sockmsg)
{
	write(sockmsg, user_cmd, sizeof(user_cmd));
}

//command quit
void cmd_quit(int sock, int sockmsg)
{
	write(sockmsg, user_cmd, sizeof(user_cmd));
}

//command help
void cmd_help(int sock, int sockmsg)
{
	char help[300];
	write(sockmsg, user_cmd, sizeof(user_cmd));
	read(sock, help, 300);

	printf("%s\n", help);
}

//command get
void cmd_get(int sock, int sockmsg, char *fileName)
{
	int fd;
	long fileSize;
	char localFilePath[200];

	write(sockmsg, user_cmd, sizeof(user_cmd));
	write(sockmsg, cmd_arg, sizeof(cmd_arg));
	printf("%s\n%s\n", user_cmd, cmd_arg);

	memset(localFilePath, 0, sizeof(localFilePath));
	getcwd(localFilePath, sizeof(localFilePath));
	strcat(localFilePath, "/");
	strcat(localFilePath, fileName);

	fd = open(localFilePath, O_RDWR|O_CREAT, S_IREAD|S_IWRITE);
	if(fd!=-1)
	{
		memset(buf, 0, dataLen);
		read(sock, &fileSize, sizeof(long));
		while(fileSize > dataLen)
		{
			read(sock, buf, dataLen);
			write(fd, buf, dataLen);
			fileSize = fileSize - dataLen;
		}

		read(sock, buf, fileSize);
		write(fd, buf, fileSize);
		close(fd);
		printf("download completed\n");
	}
	else
	{
		printf("open file %s failed\n", localFilePath);
	}
}

//command put
void cmd_put(int sock, int sockmsg, char *fileName)
{
	write(sockmsg, user_cmd, sizeof(user_cmd));
	write(sockmsg, cmd_arg, sizeof(cmd_arg));

	int fd;
	long fileSize;
	int numRead;
	char filePath[200];

	struct stat fileSta;
	
	memset(filePath, 0, sizeof(filePath));
	getcwd(filePath, sizeof(filePath));

	strcat(filePath, "/");
	strcat(filePath, fileName);

	fd = open(filePath, O_RDONLY, S_IREAD);
	if(fd != -1)
	{
		fstat(fd, &fileSta);
		fileSize = (long)fileSta.st_size;

		write(sock, &fileSize, sizeof(long));
		memset(buf, 0, dataLen);
		while(fileSize > dataLen)
		{
			read(fd, buf, dataLen);
			write(sock, buf, dataLen);
			fileSize = fileSize -dataLen;
		}

		read(fd, buf, fileSize);
		write(sock, buf, fileSize);
		close(fd);
		printf("upload completed\n");
	}
	else
	{
		printf("open file %s failed\n", filePath);
	}
}

 编译的话,用gcc -g -o client client.c

运行的话,需要注意,需要两个参数:

./client localhost 3499

一个是本地主机,一个是端口号

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>

#define TRUE 1
#define dataLen 1024
char user_cmd[10], cmd_arg[20];
char buf[dataLen];

void cmd_pwd(int sock, int sockmsg);
void cmd_dir(int sock, int sockmsg);
void cmd_cd(int sock, int sockmsg, char *dirName);
void cmd_cdback(int sock, int sockmsg);
void cmd_help(int sock, int sockmsg);
void cmd_get(int sock, int sockmsg, char *fileName);
void cmd_put(int sock, int sockmsg, char *fileName);
void cmd_quit(int sock, int sockmsg);

int main(int argc, char *argv[])
{
    int cmd_len, arg_len;
    int sock, sockmsg;
    struct sockaddr_in server, servermsg;
    struct hostent *hp;

    sock = socket(AF_INET, SOCK_STREAM, 0);
    sockmsg = socket(AF_INET, SOCK_STREAM, 0);
    
    if(sock < 0 || sockmsg < 0)
    {
        perror("opening stream socket");
        exit(1);
    }

    printf("argc is %d, argv[1] is %s\n",argc, argv[1]);

    hp = gethostbyname(argv[1]);
    //hp = gethostbyname("localhost");
    if(hp == 0)
    {
        fprintf(stderr, "%s:unknown host\n", argv[1]);
        exit(2);
    }

    server.sin_family = AF_INET;
    server.sin_port = htons(atoi(argv[2]));
    memcpy((char*)&server.sin_addr, (char*)hp->h_addr, hp->h_length);
    
    servermsg.sin_family = AF_INET;
    servermsg.sin_port = htons(atoi(argv[2]) +1);
    memcpy((char*)&servermsg.sin_addr, (char*)hp->h_addr, hp->h_length);

    if(connect(sock, (struct sockaddr *)&server, sizeof(server)) < 0 ||
        connect(sockmsg, (struct sockaddr *)&servermsg, sizeof(servermsg)) < 0)
    {
        perror("connecting stream socket");
        exit(1);
    }

    while(TRUE)
    {
        memset(user_cmd, 0, 10);
        memset(cmd_arg, 0, 20);

        //First get the input character by user
        printf("command: ");
        scanf("%s", user_cmd);

        //Then get the command charater and argument
        if(strcmp(user_cmd, "quit") == 0)
        {
            cmd_quit(sock, sockmsg);
            close(sockmsg);
            close(sock);
            printf("connection closed\n\n");
            exit(0);
        }
        else if(strcmp(user_cmd, "?") == 0)
        {
            cmd_help(sock, sockmsg);
        }
        else if(strcmp(user_cmd, "pwd") == 0)
        {
            printf("stcmp pwd --------------->>>\n");
            cmd_pwd(sock, sockmsg);
        }
        else if(strcmp(user_cmd, "dir") == 0)
        {
            cmd_dir(sock, sockmsg);
        }
        else if(strcmp(user_cmd, "cd") == 0)
        {
            scanf("%s", cmd_arg);
            cmd_cd(sock, sockmsg, cmd_arg);
        }
        else if(strcmp(user_cmd, "cd..") == 0)
        {
            cmd_cdback(sock, sockmsg);
        }
        else if(strcmp(user_cmd, "get") == 0 )
        {
            scanf("%s", cmd_arg);
            cmd_get(sock, sockmsg, cmd_arg);
        }
        else if(strcmp(user_cmd, "put") == 0)
        {
            scanf("%s", cmd_arg);
            cmd_put(sock, sockmsg, cmd_arg);
        }
        else
        {
            printf("bad command!\n");
        }
    }
}


void cmd_pwd(int sock, int sockmsg)
{
    //int numRead
    char dirName[30];
    write(sockmsg, user_cmd, sizeof(user_cmd));
    read(sock, dirName, 30);
    printf("dirName is ------->>  %s\n", dirName);
}

//command dir
void cmd_dir(int sock, int sockmsg)
{
    int i, fileNum = 0;
    char fileInfo[50];

    write(sockmsg, user_cmd, sizeof(user_cmd));
    read(sock, &fileNum, sizeof(int));

    printf("---------------------------------------\n");
    printf("file number : %d\n", fileNum);
    if(fileNum > 0)
    {
        for(i=0; i<fileNum; i++)
        {
            memset(fileInfo, 0, sizeof(fileInfo));
            read(sock, fileInfo, sizeof(fileInfo));
            printf("%s\n", fileInfo);
        }
        printf("-----------------------------------\n");
    }
    else if(fileNum == 0)
    {
        printf("directory of server point is empty.\n");
        return;
    }
    else
    {
        printf("error in command ‘dir‘\n");
        return;
    }
}

void cmd_cd(int sock, int sockmsg, char *dirName)
{
    char currentDirPath[200];
    write(sockmsg, user_cmd, sizeof(user_cmd));
    write(sockmsg, cmd_arg, sizeof(cmd_arg));
    printf("172 ----------->>\n");
    read(sock, currentDirPath, sizeof(currentDirPath));
    printf("174 ------------>>\n");
    printf("now is directory : %s\n", currentDirPath);
}

//command cd..
void cmd_cdback(int sock, int sockmsg)
{
    write(sockmsg, user_cmd, sizeof(user_cmd));
}

//command quit
void cmd_quit(int sock, int sockmsg)
{
    write(sockmsg, user_cmd, sizeof(user_cmd));
}

//command help
void cmd_help(int sock, int sockmsg)
{
    char help[300];
    write(sockmsg, user_cmd, sizeof(user_cmd));
    read(sock, help, 300);

    printf("%s\n", help);
}

//command get
void cmd_get(int sock, int sockmsg, char *fileName)
{
    int fd;
    long fileSize;
    char localFilePath[200];

    write(sockmsg, user_cmd, sizeof(user_cmd));
    write(sockmsg, cmd_arg, sizeof(cmd_arg));
    printf("%s\n%s\n", user_cmd, cmd_arg);

    memset(localFilePath, 0, sizeof(localFilePath));
    getcwd(localFilePath, sizeof(localFilePath));
    strcat(localFilePath, "/");
    strcat(localFilePath, fileName);

    fd = open(localFilePath, O_RDWR|O_CREAT, S_IREAD|S_IWRITE);
    if(fd!=-1)
    {
        memset(buf, 0, dataLen);
        read(sock, &fileSize, sizeof(long));
        while(fileSize > dataLen)
        {
            read(sock, buf, dataLen);
            write(fd, buf, dataLen);
            fileSize = fileSize - dataLen;
        }

        read(sock, buf, fileSize);
        write(fd, buf, fileSize);
        close(fd);
        printf("download completed\n");
    }
    else
    {
        printf("open file %s failed\n", localFilePath);
    }
}

//command put
void cmd_put(int sock, int sockmsg, char *fileName)
{
    write(sockmsg, user_cmd, sizeof(user_cmd));
    write(sockmsg, cmd_arg, sizeof(cmd_arg));

    int fd;
    long fileSize;
    int numRead;
    char filePath[200];

    struct stat fileSta;
    
    memset(filePath, 0, sizeof(filePath));
    getcwd(filePath, sizeof(filePath));

    strcat(filePath, "/");
    strcat(filePath, fileName);

    fd = open(filePath, O_RDONLY, S_IREAD);
    if(fd != -1)
    {
        fstat(fd, &fileSta);
        fileSize = (long)fileSta.st_size;

        write(sock, &fileSize, sizeof(long));
        memset(buf, 0, dataLen);
        while(fileSize > dataLen)
        {
            read(fd, buf, dataLen);
            write(sock, buf, dataLen);
            fileSize = fileSize -dataLen;
        }

        read(fd, buf, fileSize);
        write(sock, buf, fileSize);
        close(fd);
        printf("upload completed\n");
    }
    else
    {
        printf("open file %s failed\n", filePath);
    }
}




























































































































































































































































































以上是关于ftp服务器的简单实现——客户端的主要内容,如果未能解决你的问题,请参考以下文章

简单的单进程FTP服务器的实现

socket实现的简单的ftp服务

Java应用程序开发包实现FTP服务器端程序,提供文件传输服务和相应的统计数据。简单的用户界面和统计功能

golang代码片段(摘抄)

代码片段 - Golang 实现简单的 Web 服务器

python实现FTP服务器