⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 client.c

📁 在Linux系统上使用Socket接口实现FTP客户端和服务器的程序
💻 C
字号:
#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/fcntl.h>#include <sys/socket.h>#include <netinet/in.h>#include <netdb.h>#include <errno.h>#include <string.h>#include <arpa/inet.h>#define BUFF 1024void dispatch(char *cmd, int sockfd);int getSocket(char *address, int port){	int ret;	register int socketfd;	struct sockaddr_in sin;		if ((socketfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){		fprintf(stderr, "fail to initial socket!\n");		exit(1);	}		sin.sin_family = AF_INET;	sin.sin_port = htons(port);		inet_pton(AF_INET, address, &sin.sin_addr);	printf("Server address: %s\n",inet_ntoa(sin.sin_addr));	printf("Server port: %d\n",ntohs(sin.sin_port));		int len = sizeof(sin);	if ((ret = connect(socketfd, (struct sockaddr *)&sin, len)) == -1){		fprintf(stderr, "can't connect server!\n");		exit(2);	}		return socketfd;}void contact(int sockfd){	char cmd[BUFF];	memset(cmd, 0, BUFF);	while (1){		printf("ftp>:");		fgets(cmd,BUFF,stdin);		dispatch(cmd, sockfd);	}}char * isCdCmd(char *cmd){		char *temp = cmd;	while (*temp == '\t' || *temp == ' ')		temp++;	if (*temp == 'c' && *(temp+1) == 'd'){		temp += 2;		while (*temp == '\t' || *temp == ' ')			temp++;	}	else{		return 0;	}	int i;	if (*temp == '\n'){		printf("Usage: cd <subdirectory>\n");		return (void *)(-1);	}	for (i = 0; *(temp+i) != '\0'; i++){		if (*(temp+i) == ' ' || *(temp+i) == '\t'){			printf("Usage: cd <subdirectory>\n");			return (void *)(-1);		}		if (*(temp+i) == '\n')			*(temp+i) = '\0';	}	if (*temp == '.' && *(temp+1) == '.')		return (void *)1;	return temp;}char * isGetCmd(char *cmd){		char *temp = cmd;	while (*temp == '\t' || *temp == ' ')		temp++;	if (*temp == 'g' && *(temp+1) == 'e' && *(temp+2) == 't'){		temp += 3;		while (*temp == '\t' || *temp == ' ')			temp++;	}	else{		return 0;	}	int i;	if (*temp == '\n'){		printf("Usage: get <fileName>\n");		return (void *)(-1);	}	for (i = 0; *(temp+i) != '\0'; i++){		if (*(temp+i) == ' ' || *(temp+i) == '\t'){			printf("Usage: get <fileName>\n");			return (void *)(-1);		}		if (*(temp+i) == '\n')			*(temp+i) = '\0';	}	return temp;}char * isPutCmd(char *cmd){		char *temp = cmd;	while (*temp == '\t' || *temp == ' ')		temp++;	if (*temp == 'p' && *(temp+1) == 'u' && *(temp+2) == 't'){		temp += 3;		while (*temp == '\t' || *temp == ' ')			temp++;	}	else	{		return 0;	}	int i;	if (*temp == '\n')	{		printf("Usage: put <fileName>\n");		return (void *)(-1);	}	for (i = 0; *(temp+i) != '\0'; i++)	{		if (*(temp+i) == ' ' || *(temp+i) == '\t')		{			printf("Usage: put <fileName>\n");			return (void *)(-1);		}		if (*(temp+i) == '\n')			*(temp+i) = '\0';	}	return temp;}void quitCmd(int sockfd){	write(sockfd, "QUIT", BUFF);	close(sockfd);	printf("Goodbye!! Welcome to use this again!\n");	exit(0);}void pwdCmd(int sockfd){	write(sockfd, "PWD", BUFF);	char buf[BUFF] = {0};	read(sockfd, buf, BUFF);	if (*buf == '\0')		strcpy(buf, "\n");	printf("Current server directory is %s", buf);}void dirCmd(int sockfd){	write(sockfd, "DIR", BUFF);	char buf[BUFF] = {0};		while (read(sockfd, buf, BUFF) > 0){		if (buf[0] == '\n')			break;		printf("\t%s", buf);	}}void cdCmd(char *file, int sockfd){	char buf[BUFF] = "CD ";	int i;	for (i = 0; file[i] != '\0'; i++)	{		buf[i+3] = file[i];	}	buf[i+3] = '\0';		write(sockfd, buf, BUFF);	// send "CD <dir>"	read(sockfd, buf, BUFF);	// receive "<dir>"	if (*buf == '\n')	{		printf("fail to change directory\n");	}	else	{		if (*buf == '\0')			strcpy(buf, "\n");		printf("Current server directory is ./%s", buf);	}}void cdupCmd(int sockfd){	char buf[BUFF] = {0};	write(sockfd, "CDUP", BUFF);	// send "CDUP"	read(sockfd, buf, BUFF);	// receive "<dir>"	if (*buf == '\n'){		printf("fail to change directory\n");	}	else{		if (*buf == '\0')			strcpy(buf, "\n");		printf("Current server directory is ./%s", buf);	}}void getCmd(char *file, int sockfd){	printf("try to get file:%s\n", file);		char buf[BUFF] = "GET ";	int i;	for (i = 0; file[i] != '\0'; i++){		buf[i+4] = file[i];	}	buf[i+4] = '\0';		write(sockfd, buf, BUFF);	// send "GET <file>"	read(sockfd, buf, BUFF);	// receive "<dataSocketPort>" or "ERROR"	if (*buf == 'E'){		printf("file %s is not exist!\n", file);		return;	}		int target;	if((target = open(file, O_WRONLY|O_CREAT|O_TRUNC, 0644)) < 0){		printf("error to write to file %s!\n", file);		write(sockfd, "ERROR", BUFF);	// send "ERROR"		return;	}	else		write(sockfd, "READY", BUFF);	// send "READY"		struct sockaddr_in server;	int len = sizeof(server);	getsockname(sockfd,(struct sockaddr*)&server, &len);	register int dataSk = getSocket(inet_ntoa(server.sin_addr), atoi(buf));		int k;	printf("downloading...\n");	while ((k = read(dataSk, buf, BUFF)) > 0){		write(target, buf, k);		if (k != BUFF)			break;	}	close(dataSk);	close(target);	printf("finished!\n");}void putCmd(char *file, int sockfd){	printf("try to upload file:%s\n", file);	int source;	if((source = open(file,O_RDONLY)) < 0)	{		printf("fail to open file %s!\n", file);		return;	}			char buf[BUFF] = "PUT ";	int i;	for (i = 0; file[i] != '\0'; i++)	{		buf[i+4] = file[i];	}	buf[i+4] = '\0';		write(sockfd, buf, BUFF);		read(sockfd, buf, BUFF);	// receive "<dataSocketPort>" or "ERROR"	if (*buf == 'E')	{		printf("file %s is already exist in server!\n", file);		close(source);		return;	}		struct sockaddr_in server;	int len = sizeof(server);	getsockname(sockfd,(struct sockaddr*)&server, &len);	register int dataSk = getSocket(inet_ntoa(server.sin_addr), atoi(buf));		int k;	printf("uploading...\n");	lseek(source, 0, SEEK_SET);	memset(buf, 0x0 ,BUFF);	while((k = read(source,buf,BUFF)) > 0)	{					write(dataSk, buf, k);	}	write(dataSk, 0, 0);		close(dataSk);	close(source);	printf("finished!\n");}void helpCmd(){	printf("?\n\tdisplay help message\n");	printf("!dir\n\tlist the client's current directory\n");	printf("get\n\tfetch a file from server\n\tget <filename>\n");	printf("put\n\tunload a file to server\n\tput <filename>\n");	printf("pwd\n\tdisplay current directory of server\n");	printf("dir\n\tlist  files in current directory of server\n");	printf("cd\n\tchange current directory of server\n\tcd <subdirectory>|\"..\"\n");	printf("quit\n\tquit ftp client\n");}void lowerCase(char *cmd){	int i;	while (*cmd == '\t' || *cmd == ' ')		cmd++;		for (i = 0; cmd[i] != ' '; i++){		if (cmd[i] >= 'A' && cmd[i] <= 'Z')			cmd[i] += ('a'-'A');	}}void dispatch(char *cmd, int sockfd){	char *file;	int r;	lowerCase(cmd);	while (*cmd == '\t' || *cmd == ' ')		cmd++;			if (*cmd == '?'){		helpCmd();		return;	}		if (*cmd == '!'){		if(*(cmd+1) == 'd' && *(cmd+2) == 'i' &&  *(cmd+3) == 'r'){			char buf[BUFF];			FILE * pf=popen("ls","r");			while(fgets(buf,BUFF,pf) != NULL){				printf("\t%s",buf);			}			pclose(pf);			printf("\n");			return;		}				}		else if (*cmd == 'q'){		char * temp = cmd;		if (*temp == 'q' && *(temp+1) == 'u' && *(temp+2) == 'i' && *(temp+3) == 't'){			temp += 4;			while (*temp == '\t' || *temp == ' ')				temp++;			if(*temp == '\n')				quitCmd(sockfd);			else 				return;		}		else 			return;	}		else if (*cmd == 'p'){		char *temp = cmd;		if (*temp == 'p' && *(temp+1) == 'w' && *(temp+2) == 'd'){			temp += 3;			while (*temp == '\t' || *temp == ' ')				temp++;			if(*temp == '\n')				pwdCmd(sockfd);			return;		}		else if((file = isPutCmd(cmd)) != 0){			if ((int)file == -1)				return;			else				putCmd(file, sockfd);			return;		}		else return;			}		else if (*cmd == 'd'){		char *temp = cmd;		if (*temp == 'd' && *(temp+1) == 'i' && *(temp+2) == 'r'){			temp += 3;			while (*temp == '\t' || *temp == ' ')				temp++;			if(*temp == '\n')				dirCmd(sockfd);		}		return;	}		else if (*cmd == 'c'){		if ((file = isCdCmd(cmd)) != 0){			if ((int)file == -1)				return;			else if ((int)file == 1)				cdupCmd(sockfd);			else				cdCmd(file, sockfd);			return;		}		else return;	}		else if(*cmd == 'g'){		if((file = isGetCmd(cmd)) != 0){			if ((int)file == -1)				return;			else				getCmd(file, sockfd);			return;		}	}		printf("Unknown ftp command!\n");	return;}int main(int argc, char *argv[]){	if (argc != 3){		printf("Usage:client <address> <port>\n");		return 0;	}		int target,ret;	char buf[BUFF];	register int socketfd = getSocket(argv[1], atoi(argv[2]));		if(read(socketfd,buf,BUFF) > 0){		printf("You are Client %s\n",buf);	}		contact(socketfd);	return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -