1、ftp文件服务器的功能,客户端通过访问服务器的ip地址和端口,可以连接到服务器。客户端连接成功后,可以拷贝服务器下的文件和访问服务器的文件夹,同时可以将自己的文件拷贝给服务器
2、服务器demo
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
#define LS 0
#define PWD 1
#define GET 2
#define IFGO 3
#define QUIT 8
#define PUT 5
#define CD 6
#define DOFILE 9
struct Msg
{
int type;
char cmd[1024];
char readBuf[1024];
};
int str_cmp(char *cmd)
{
if(!strcmp("ls",cmd))
return LS;
if(!strcmp("pwd",cmd))
return PWD;
if(!strcmp("quit",cmd))
return QUIT;
if(strstr(cmd,"get")!=NULL)
return GET;
if(strstr(cmd,"put")!=NULL)
return PUT;
if(strstr(cmd,"cd")!=NULL)
return CD;
return 100;
}
//获取要切换的文件夹和要拷贝的文件名字
char *getDirFile(char *cmd)
{
char *p;
p = strtok(cmd," ");
p= strtok(NULL," ");
return p;
}
switch (ret)
{
case LS:
case PWD:
msg.type = 0;
fd = popen(msg.cmd,"r");
fread(msg.readBuf,sizeof(msg.readBuf),1,fd);
int n_write =write(c_fd,&msg,sizeof(msg));
if(n_write == -1)
{
perror("write error");
}
break;
case CD:
msg.type = 1;
char *dir = getDirFile(msg.cmd);
printf("dir :%s\n",dir);
chdir(dir);
break;
case QUIT:
printf("client out\n");
break;
case GET:
strcpy(buf,msg.cmd);
file = getDirFile(buf);
if((access(file,F_OK))==-1)
{
strcpy(msg.readBuf,"no this file");
write(c_fd,&msg,sizeof(msg));
}
else
{
msg.type = DOFILE;
int fd1 = open(file,O_RDWR);
read(fd1,msg.readBuf,sizeof(msg.readBuf));
write(c_fd,&msg,sizeof(msg));
close(fd1);
}
break;
int main(int argc ,char**argv)
{
int sever_id;
int client_fd;
struct Msg msg;
int severRead;
if(argc !=2)
{
printf("param error\n");
exit(-1);
}
struct sockaddr_in sever_addr;
struct sockaddr_in client_addr;
sever_addr.sin_family = AF_INET;
sever_addr.sin_port =htons( atoi(argv[1]));
inet_aton("127.0.0.1",&sever_addr.sin_addr);
sever_id = socket(AF_INET,SOCK_STREAM,0);
if(sever_id == -1)
{
perror("socket error");
exit(-1);
}
bind(sever_id,(struct sockaddr *)&sever_addr,sizeof(struct sockaddr_in));
listen(sever_id,10);
while(1)
{
client_fd = accept(sever_id,NULL,NULL);
if(client_fd == -1)
{
perror("accept error");
exit(-1);
}
if(fork()==0)
{
printf("one client connected\n");
while(1)
{
memset(msg.cmd,'\0',sizeof(msg.cmd));
severRead = read(client_fd,&msg,sizeof(msg));
if(severRead==0)
{
printf("client out\n");
break;
}
else
{
handler_msg(msg,client_fd);
}
}
}
}
close(sever_id);
close(client_fd);
return 0;
}
3、客户端demo
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
#define LS 0
#define PWD 1
#define GET 2
#define IFGO 3
#define QUIT 8
#define LCD 10
#define LLS 5
#define PUT 7
#define CD 6
#define DOFILE 9
struct Msg
{
int type;
char cmd[1024];
char readBuf[2048];
};
int str_cmp(char *cmd)
{
if(!strcmp("ls",cmd))
return LS;
if(!strcmp("pwd",cmd))
return PWD;
if(!strcmp("quit",cmd))
return QUIT;
if(!strcmp("lls",cmd))
return LLS;
if(strstr(cmd,"lcd")!=NULL)
return LCD;
if(strstr(cmd,"get")!=NULL)
return GET;
if(strstr(cmd,"put")!=NULL)
return PUT;
if(strstr(cmd,"cd")!=NULL)
return CD;
return -1;
}
char *getDirFile(char *cmd)
{
char *p;
p = strtok(cmd," ");
p= strtok(NULL," ");
return p;
}
void sever_client_msg(struct Msg msg,int c_fd)
{
char buf[128];
int n_read;
char *file = NULL;
struct Msg msgget;
memset(msgget.readBuf,0,sizeof(msgget.readBuf));
n_read = read(c_fd,&msgget,sizeof(msgget));
if(n_read == -1)
{
printf("sever is out\n");
exit(-1);
}
else if(msgget.type==DOFILE)
{
file = getDirFile(msgget.cmd);
int fd = open(file,O_RDWR|O_CREAT|O_TRUNC,0666);
if(fd==-1)
{
perror("open error");
}
write(fd,msgget.readBuf,strlen(msgget.readBuf));
putchar('>');
}
else
{
printf("--------------\n");
printf("\n%s\n",msgget.readBuf);
printf("--------------\n");
putchar('>');
}
}
int handler_msg(struct Msg msg,int c_fd)
{
int ret;
char buf[128]={0};
char *file = NULL;
ret = str_cmp(msg.cmd);
switch (ret)
{
case CD:
case LS:
case PWD:
msg.type = 0;
write(c_fd,&msg,sizeof(msg));
break;
case GET:
msg.type = 2;
write(c_fd,&msg,sizeof(msg));
printf("%s\n",msg.cmd);
break;
case LLS:
system("ls");
break;
case LCD:
file = getDirFile(msg.cmd);
printf("dir:%s\n",file);
chdir(file);
printf("dir:%s\n",file);
break;
case PUT:
strcpy(buf,msg.cmd);
file = getDirFile(buf);
if((access(file,F_OK))==-1)
{
printf("client no this file\n");
}
else
{
int fd = open(file,O_RDWR);
read(fd,msg.readBuf,sizeof(msg.readBuf));
close(fd);
write(c_fd,&msg,sizeof(msg));
}
break;
case QUIT:
strcpy(msg.cmd,"quit");
write(c_fd,&msg,sizeof(msg));
close(c_fd);
exit(-1);
}
return ret;
}
int main(int argc,char**argv)
{
int mark=0;
int ret;
int client_id;
struct Msg msg;
if(argc !=3)
{
printf("param error\n");
exit(-1);
}
struct sockaddr_in client_addr;
client_addr.sin_family = AF_INET;
client_addr.sin_port= htons(atoi(argv[2]));
inet_aton(argv[1],&client_addr.sin_addr);
client_id = socket(AF_INET, SOCK_STREAM ,0);
if(client_id == -1)
{
perror("socket error");
exit(-1);
}
connect(client_id,(struct sockaddr *)&client_addr,sizeof(struct sockaddr_in));
while(1)
{
printf("input\n");
memset(msg.cmd,0,sizeof(msg.cmd));
if(mark==0)
{
putchar('>');
}
gets(msg.cmd);
ret = handler_msg(msg,client_id);
if(ret>IFGO)
{
putchar('>');
continue;
}
if(ret==-1)
{
printf("cmd error\n");
putchar('>');
continue;
}
sever_client_msg(msg,client_id);
}
close(client_id);
return 0;
}