实现FTP服务器的部分功能
1、ls 查看服务端文件
2、pwd 查看服务端所在目录
3、lls 查看客户端文件
4、lcd xxx 进入xxx目录
5、get xxx 从服务端获取xxx文件到客户端
6、put xxx 从客户端上传xxx文件到服务端
其中,config_new.h文件如下
#define LS 1
#define PWD 2
#define QUIT 3
#define LLS 4
#define LCD 5
#define CD 6
#define GET 7
#define PUT 8
char* get_file_name(char*cmd)
{
char* p = NULL;
p = strtok(cmd," ");
p = strtok(NULL," ");
return p;
}
int get_cmd_type(char*cmd)
{
if(strcmp(cmd,"ls") ==0) return LS;
if(strcmp(cmd,"pwd") ==0) return PWD;
if(strcmp(cmd,"quit")==0) return QUIT;
if(strcmp(cmd,"lls") ==0) return LLS;
if(strstr(cmd,"lcd")!=NULL) return LCD;
if(strstr(cmd,"get")!=NULL) return GET;
if(strstr(cmd,"put")!=NULL) return PUT;
return -1;
}
struct msg{
int flag;
char cmd[32];
char cmd_data[1024];//LS,PWD,LLS
char file_data[1024];
};
服务端代码如下
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <strings.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "config_new.h"
void cmd_handler(int iClient_fd,struct msg server_Msg);
int cmd_handler_get(int iClient_fd,struct msg server_Msg);
int cmd_handler_put(int iClient_fd,struct msg server_Msg);
int main(int argc ,char**argv)
{
int iServer_fd;
int iClient_fd;
int iAddrLen;
struct msg server_Msg;
struct sockaddr_in server_Addr;
struct sockaddr_in client_Addr;
iServer_fd = socket(AF_INET,SOCK_STREAM,0);
if(iServer_fd == -1){
perror("socket:");
return -1;
}
iAddrLen = sizeof(struct sockaddr);
bzero(&server_Addr,iAddrLen); //³õʼ»¯½á¹¹Ìå
server_Addr.sin_family = AF_INET; //ÉèÖõØÖ·¼Ò×å
server_Addr.sin_port = htons(8013); //ÉèÖö˿Ú
server_Addr.sin_addr.s_addr = inet_addr("127.0.0.1"); //ÉèÖõØÖ·
if(-1 == bind(iServer_fd,(struct sockaddr *)&server_Addr,iAddrLen)){
perror("bind:");
return -1;
} /* bindµÄʱºò½øÐÐת»¯ */
if(-1==listen(iServer_fd,10)){
perror("listen:");
return -1;
}
printf("connecting ...\n");
int n_recv;
pid_t uiPid;
while(1){
iClient_fd = accept(iServer_fd,(struct sockaddr *)&client_Addr,&iAddrLen);
if(iClient_fd == -1){
perror("accept:");
return -1;
}
uiPid = fork();
if(uiPid == 0){
printf("connected sucess in Server\n");
while(1){
memset(&server_Msg,0,sizeof(server_Msg));
n_recv = recv(iClient_fd,&server_Msg,sizeof(server_Msg),0);
if(n_recv == -1){perror("recv:");return -1;}
if(n_recv == 0){
printf("client loss\n");
break;
}else if(n_recv > 0){
cmd_handler(iClient_fd,server_Msg);
}
}
}
}
close(iServer_fd);
return 0;
}
void cmd_handler(int iClient_fd,struct msg server_Msg)
{
FILE* fp;
printf("get data:%s\n",server_Msg.cmd);
int ret = get_cmd_type(server_Msg.cmd);
switch(ret){
case LS:
case PWD:
fp = popen(server_Msg.cmd,"r");
fread(server_Msg.cmd_data,sizeof(server_Msg.cmd_data),1,fp);
send(iClient_fd,&server_Msg,sizeof(server_Msg),0);
break;
case QUIT:
printf("client quit\n");
close(iClient_fd);
break;
case LLS:
case LCD:
break;
case GET:
cmd_handler_get(iClient_fd,server_Msg);
break;
case PUT:
cmd_handler_put(iClient_fd,server_Msg);
break;
}//switch end
}
int cmd_handler_put(int iClient_fd,struct msg server_Msg)
{
int file_fd;
char* file_name = NULL;
file_name = get_file_name(server_Msg.cmd);
recv(iClient_fd,&server_Msg.flag,sizeof(int),0);
if(server_Msg.flag == -1){
printf("file not exit\n");
return -1;
}else if(server_Msg.flag == 1){
printf("get file sucess\n");
//file_fd = open(file_name,O_RDWR|O_CREAT|O_TRUNC|O_APPEND);
file_fd = open(file_name,O_RDWR|O_CREAT);
while(1){
recv(iClient_fd,&server_Msg,sizeof(server_Msg),0);
if(server_Msg.flag == 100){
printf("get file sucess3\n");
break;
}
write(file_fd,server_Msg.file_data,strlen(server_Msg.file_data)-2);
memset(&server_Msg,0,sizeof(server_Msg));
}
close(file_fd);
return 0;
}
}
int cmd_handler_get(int iClient_fd,struct msg server_Msg)
{
int file_fd;
char* file_name = NULL;
file_name = get_file_name(server_Msg.cmd);
if(access(file_name,F_OK) == -1){
printf("File does not exist\n");
server_Msg.flag = -1;
send(iClient_fd,&server_Msg.flag,sizeof(server_Msg.flag),0);
return -1;
}else{
file_fd = open(file_name,O_RDONLY);
if(file_fd == -1){
perror("open failed");
server_Msg.flag = -1;
send(iClient_fd,&server_Msg.flag,sizeof(server_Msg.flag),0);
return -1;
}else{
server_Msg.flag = 1;
send(iClient_fd,&server_Msg.flag,sizeof(server_Msg.flag),0);
printf("file exit\n");
while(1){
if(read(file_fd,server_Msg.file_data,sizeof(server_Msg.file_data))==0){
server_Msg.flag = 100;
send(iClient_fd,&server_Msg,sizeof(server_Msg),0);
break;
}
send(iClient_fd,&server_Msg,sizeof(server_Msg),0);
memset(&server_Msg,0,sizeof(server_Msg));
}
close(file_fd);
return 0;
}
}
}
客户端代码如下
#include <stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <strings.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "config_new.h"
int cmd_handler(int iClient_fd,struct msg client_Msg);
int cmd_handler_get(int iClient_fd,struct msg client_Msg);
int cmd_handler_put(int iClient_fd,struct msg client_Msg);
int main()
{
int iClient_fd;
int iAddrLen;
int ret;
struct msg client_Msg;
struct sockaddr_in iClientAddr;
iClient_fd = socket(AF_INET,SOCK_STREAM, 0);
if(iClient_fd == -1){
perror("socket:");
return -1;
}
iAddrLen = sizeof(struct sockaddr);
bzero(&iClientAddr,iAddrLen); //3?¨º??¡¥?¨¢11¨¬?
iClientAddr.sin_family = AF_INET; //¨¦¨¨??¦Ì??¡¤?¨°¡Á?
iClientAddr.sin_port = htons(8013); //¨¦¨¨?????¨²
iClientAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); //¨¦¨¨??¦Ì??¡¤
int iConnect = connect(iClient_fd,(struct sockaddr*)&iClientAddr,iAddrLen);
if(iConnect == -1){
perror("connect:");
return -1;
}else{
printf("connect sucess in Clinet\n");
}
while(1){
memset(&client_Msg,0,sizeof(client_Msg));
printf(">");
fgets(client_Msg.cmd,sizeof(client_Msg.cmd),stdin);
if(client_Msg.cmd[strlen(client_Msg.cmd)-1]=='\n'){
client_Msg.cmd[strlen(client_Msg.cmd)-1]='\0';
}
if(send(iClient_fd,&client_Msg,sizeof(client_Msg),0)==-1){
perror("send:");
return -1;
}
cmd_handler(iClient_fd,client_Msg);
}
close(iClient_fd);
return 0;
}
int cmd_handler(int iClient_fd,struct msg client_Msg)
{
int ret = get_cmd_type(client_Msg.cmd);
char* dir_name = NULL;
switch(ret){
case LS:
case PWD:
recv(iClient_fd,&client_Msg,sizeof(client_Msg),0);
printf("*************************\n");
printf("%s",client_Msg.cmd_data);
printf("*************************\n");
break;
case QUIT:
printf("client exit\n");
exit(0);
case LLS:
system("ls");
break;
case LCD:
dir_name = get_file_name(client_Msg.cmd);
chdir(dir_name);
break;
case GET:
cmd_handler_get(iClient_fd,client_Msg);
break;
case PUT:
cmd_handler_put(iClient_fd,client_Msg);
break;
}//switch end
return 0;
}
int cmd_handler_put(int iClient_fd,struct msg client_Msg)
{
int file_fd;
char* file_name = NULL;
file_name = get_file_name(client_Msg.cmd);
if(access(file_name,F_OK) == -1){
printf("File does not exist\n");
client_Msg.flag = -1;
send(iClient_fd,&client_Msg.flag,sizeof(client_Msg.flag),0);
return -1;
}else{
file_fd = open(file_name,O_RDONLY);
if(file_fd == -1){
perror("open failed");
client_Msg.flag = -1;
send(iClient_fd,&client_Msg.flag,sizeof(client_Msg.flag),0);
return -1;
}else{
client_Msg.flag = 1;
send(iClient_fd,&client_Msg.flag,sizeof(client_Msg.flag),0);
printf("file exit\n");
while(1){
if(read(file_fd,client_Msg.file_data,sizeof(client_Msg.file_data))==0){
client_Msg.flag = 100;
send(iClient_fd,&client_Msg,sizeof(client_Msg),0);
break;
}
send(iClient_fd,&client_Msg,sizeof(client_Msg),0);
memset(&client_Msg,0,sizeof(client_Msg));
}
close(file_fd);
return 0;
}
}
}
int cmd_handler_get(int iClient_fd,struct msg client_Msg)
{
int file_fd;
char* file_name = NULL;
file_name = get_file_name(client_Msg.cmd);
recv(iClient_fd,&client_Msg.flag,sizeof(int),0);
if(client_Msg.flag == -1){
printf("file not exit\n");
return -1;
}else if(client_Msg.flag == 1){
printf("get file sucess\n");
//file_fd = open(file_name,O_RDWR|O_CREAT|O_TRUNC|O_APPEND);
file_fd = open(file_name,O_RDWR|O_CREAT|O_TRUNC);
while(1){
recv(iClient_fd,&client_Msg,sizeof(client_Msg),0);
if(client_Msg.flag == 100){
printf("get file sucess3\n");
break;
}
write(file_fd,client_Msg.file_data,strlen(client_Msg.file_data)-2);
memset(&client_Msg,0,sizeof(client_Msg));
}
close(file_fd);
return 0;
}
}