FTP云盘项目介绍:
FTP服务器(File Transfer ProtocolServer)是在互联网上提供文件存储和访问服务的计算机,它们依照FTP协议提供服务。FTP是File Transfer Protoco(文件传输协议)。程序运行,服务端不断接收客户端指令,服务端可同时处理多个客户端接入并对指令作出解析,并把执行结果返回给客户端,客户端根据服务端对指令的解析并把由服务端传递过来的处理信息通过客户端呈现给客户,实现文件的各种操作。
Linux网络编程实现的FTP服务器,服务器服务端和客户端组成,具有浏览远程服务端的文件和浏览客户端本地文件,同时支持对远程服务端文件的删除,存储,归档操作处理,以及客户端对远程服务端文件的上传和下载。
基本功能:
利用socket实现的云盘:
lls: 查看客户端的文件
ls:查看服务器的文件
ps:查看进程信息
g:客户端退出
pwd:查看服务端的路径
lpwd:查看客户端的路径
cd xxx:切换服务端的目录
lcd xxx:切换客户端的目录
put xxx:上传文件
get xxx:下载文件
rm xxx:删除服务端xxx文件
lrm xxx:删除客户端xxx文件
service:
#include<string.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#define FIF 5
#define READSIZE 1024
#define WRITESIZE 128
#define SERVICERETURN "service return:"
char *getbehind(char cmd[128])
{
char *p;
p = (char *)malloc(128);
p = strtok(cmd," ");
p = strtok(NULL," ");
return p;
}
void receivefile(char cmd[128],int c_fd)
{
char *p = getbehind(cmd);
char readBuf[8000] = {};
int fd = open(p,O_RDWR | O_CREAT,0666);
read(c_fd,readBuf,8000);
write(fd,readBuf,8000);
printf("service recive file success!\n");
close(fd);
bzero(p,8000);
bzero(readBuf,8000);
}
void delete(char cmd[128])
{
char *p = getbehind(cmd);
if(access(p,F_OK) == -1)
{
printf("the service not %s file!\n",p);
}
else
{
if(remove(p) == -1)
{
printf("the service %s delsete failed!\n",p);
}
else
{
printf("service delete %s success!\n",p);
}
}
memset(p,0,sizeof(p));
}
int change(char cmd[128])
{
if(!strcmp("ls",cmd))
{
return 1;
}
else if(!strcmp("ps",cmd))
{
return 2;
}
else if(!strcmp("g",cmd))
{
return 3;
}
else if(strstr(cmd,"lcd") != NULL)
{
return 4;
}
else if(strstr(cmd,"get") !=NULL)
{
return 5;
}
else if(strstr(cmd,"put"))
{
return 6;
}
else if(strstr(cmd,"cd") != NULL)
return 7;
else if(!strcmp("pwd",cmd))
return 8;
else if(strstr(cmd,"lrm") != NULL)
return 9;
else if(!strcmp("lwpd",cmd))
return 10;
else if(strstr(cmd,"rm"))
return 11;
}
void chooescmd(char cmd[128],int c_fd)
{
int ret = change(cmd);
FILE *fdb;
char *Freadbuf = (char *)malloc(128);
char *p = (char *)malloc(8000);
char readbuf[8000] = {};
//char *readBuf_1 = (char *)malloc(128);
int sfd = -1;
printf("ret = %d\n",ret);
switch(ret)
{
case 1:
fdb = popen("ls","r");
fread(readbuf,sizeof(readbuf),1,fdb);
write(c_fd,readbuf,sizeof(readbuf));
memset(readbuf,0,sizeof(readbuf));
printf("The message was sent to the client successfully.\n");
break;
case 2:
system("ps");
break;
case 3:
read(c_fd,Freadbuf,128);
printf("%s\n",Freadbuf);
exit(0);
break;
case 4:
printf("client into path success!\n");
break;
case 5:
memset(readbuf,0,8000);
p = getbehind(cmd);
if(access(p,F_OK) == -1)
{
write(c_fd,"not file!",strlen("not file!"));
}
else
{
sfd = open(p,O_RDWR,0666);
read(sfd,readbuf,8000);
write(c_fd,readbuf,sizeof(readbuf));
close(sfd);
memset(p,0,8000);
}
break;
case 6:
receivefile(cmd,c_fd);
break;
case 7:
p = getbehind(cmd);
if(chdir(p) == -1)
{
printf("service shift error\n");
}
else
{
printf("service path shift success\n");
}
break;
case 8:
fdb = popen("pwd","r");
fread(readbuf,sizeof(readbuf),1,fdb);
write(c_fd,readbuf,sizeof(readbuf));
memset(readbuf,0,sizeof(readbuf));
printf("the service pwd ok\n");
break;
case 9:
memset(p,0,8000);
p = getbehind(cmd);
printf("delete client %s file\n",p);
memset(p,0,8000);
case 10:
// read(c_fd,readbuf,strlen(readbuf));
// printf("%s",readbuf);
// memset(readbuf,0,8000);
printf("client lpwd ok!");
break;
case 11:
delete(cmd);
break;
}
}
int main(int argc,char *argv[])
{
if(argc != 3)
{
perror("argc");
exit(0);
}
int s_fd = -1;
int c_fd = -1;
pid_t pid;
int nread = -1;
char Readbuf[READSIZE] = {};
char Writebuf[WRITESIZE] = {};
s_fd = socket(AF_INET,SOCK_STREAM,0);
if(s_fd == -1)
{
perror("socket:");
exit(0);
}
struct sockaddr_in s_addr;
struct sockaddr_in c_addr;
//init
bzero(&s_addr,sizeof(s_addr));
s_addr.sin_family = AF_INET;
s_addr.sin_port = htons(atoi(argv[2]));
inet_pton(AF_INET,argv[1],&s_addr.sin_addr.s_addr);
//bind
int bind_ret = bind(s_fd,(struct sockaddr *)&s_addr,sizeof(s_addr));
if(bind_ret == -1)
{
perror("bind:");
exit(0);
}
//listen
int listen_ret = -1;
listen_ret = listen(s_fd,FIF);
if(listen_ret == -1)
{
perror("listen");
exit(0);
}
printf("wait connecting!\n");
socklen_t addrlen = sizeof(struct sockaddr_in);
memset(&c_addr,0,addrlen);
while(1)
{
//accept
c_fd = accept(s_fd,(struct sockaddr *)&c_addr,&addrlen);
if(c_fd == -1)
{
perror("accept:");
continue;
}
printf("connect success! %s\n",inet_ntoa(c_addr.sin_addr));
pid = fork();
if(pid == 0)
{
while(1)
{
nread = read(c_fd,Readbuf,128);
chooescmd(Readbuf,c_fd);
bzero(Readbuf,sizeof(Readbuf));
}
}
}
return 0;
}
client:
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#define READSIZE 1024
#define WRITESIZE 128
char *getbind(char cmd[128])
{
char *p = (char *)malloc(128);
p = strtok(cmd," ");
p = strtok(NULL," ");
return p;
}
void delete(char cmd[128])
{
char *p = getbind(cmd);
if(access(p,F_OK) == -1)
{
printf("client not this %s file!\n",p);
}
else
{
if(remove(p) == -1)
{
printf("remove fail!\n");
perror("remove");
}
printf("remove %s success!",p);
}
bzero(p,sizeof(p));
}
void getmessage(char cmd[128],int c_fd)
{
char *p = getbind(cmd);
int fd = open(p,O_RDWR|O_CREAT,0666);
char readBuf[8000] = {};
read(c_fd,readBuf,8000);
write(fd,readBuf,strlen(readBuf));
printf("updown success!\n");
close(fd);
memset(p,0,sizeof(p));
}
void putmessage(char cmd[128],int c_fd)
{
char *p = getbind(cmd);
if(access(p,F_OK) == -1)
{
printf("the client not file!\n");
write(c_fd,"the client not file!",strlen("the client not file!"));
}
else
{
int fd = open(p,O_RDWR,0666);
char readBuf[8000] = {};
read(fd,readBuf,8000);
write(c_fd,readBuf,strlen(readBuf));
printf("the file put success!\n");
close(fd);
bzero(p,8000);
bzero(readBuf,8000);
}
}
int change(char cmd[128])
{
if(!strcmp(cmd,"lls"))
return 1;
else if(!strcmp(cmd,"ls"))
return 2;
else if(!strcmp(cmd,"g"))
return 3;
else if(strstr(cmd,"lcd") != NULL)
{
return 4;
}
else if(strstr(cmd,"cd") != NULL)
{
return 5;
}
else if(strstr(cmd,"get") != NULL)
return 6;
else if(strstr(cmd,"put") != NULL)
return 7;
else if(!strcmp(cmd,"pwd"))
return 8;
else if(strstr(cmd,"lrm") != NULL)
return 9;
else if(!strcmp(cmd,"lpwd"))
return 10;
else if(strstr(cmd,"cd") != NULL)
return 11;
}
void chooescmd(char cmd[128],int c_fd)
{
int ret = change(cmd);
printf("cmd:%s ret:%d\n",cmd,ret);
char *p = (char *)malloc(8000);
switch(ret)
{
case 1:
system("ls");
break;
case 2:
read(c_fd,p,8000);
printf("%s\n",p);
bzero(p,8000);
break;
case 3:
printf("unconnecting!\n");
write(c_fd,"away host",128);
close(c_fd);
exit(0);
break;
// case 4:
// printf("service into %s",cmd);
// break;
case 4:
p = getbind(cmd);
chdir(p);
printf("client into %s\n",cmd);
//memset(p,0,8000);
bzero(p,sizeof(p));
break;
case 5:
/* p = getbind(cmd);
chdir(p);
printf("client into %s\n",cmd);
//memset(p,0,8000);
bzero(p,sizeof(p));
*/
printf("into service path ok!\n");
break;
case 6:
getmessage(cmd,c_fd);
break;
case 7:
putmessage(cmd,c_fd);
break;
case 8:
read(c_fd,p,128);
printf("service pwd:%s\n",p);
bzero(p,8000);
break;
case 9:
delete(cmd);
break;
case 10:
system("pwd");
break;
case 11:
p = getbind(cmd);
printf("service delete %s ok!\n",p);
memset(p,0,sizeof(p));
break;
}
}
int main(int argc,char *argv[])
{
char readBuf[READSIZE];
char writeBuf[WRITESIZE];
//create struct sockaddr_in;
struct sockaddr_in sin;
if(argc != 3)
{
perror("argc");
exit(0);
}
//create socket
int c_fd = -1;
c_fd = socket(AF_INET,SOCK_STREAM,0);
if(c_fd == -1)
{
perror("socket");
exit(0);
}
//init struct sin
bzero(&sin,sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_port = htons(atoi(argv[2]));
inet_pton(AF_INET,argv[1],&sin.sin_addr.s_addr);
//connect
int cn_ret = -1;
cn_ret = connect(c_fd,(struct sockaddr *)&sin,sizeof(sin));
if(cn_ret == -1)
{
perror("connect");
exit(0);
}
printf("connect success!.................\n");
//wait send(write)
while(1)
{
bzero(writeBuf,WRITESIZE);
printf("..>");
gets(writeBuf);
printf("cmd:....%s\n",writeBuf);
write(c_fd,writeBuf,strlen(writeBuf));
chooescmd(writeBuf,c_fd);
printf("---------cmd---------\n");
//bzero(writeBuf,strlen(writeBuf));
memset(writeBuf,0,strlen(writeBuf));
}
return 0;
}
ps:
1. popen()和system()函数功能一样 只是system是显示在屏幕上,而popen()是被存在一个文件流上
2. 在C语言中,`strtok()` 是一个用于分割字符串的函数,位于 `<string.h>` 头文件中。它可以将一个字符串分割成多个子字符串,根据指定的分隔符进行分割。以下是 `strtok()` 函数的基本使用示例
#include <string.h>
#include <stdio.h>
int main() {
char str[] = "Hello,World,How,Are,You";
char delim[] = ",";
// 第一次调用,传入要切割的字符串和分隔符
char *token = strtok(str, delim);
// 循环遍历切割后的子字符串
while (token != NULL) {
printf("%s\n", token);
// 后续调用传入 NULL,继续切割剩余的字符串
token = strtok(NULL, delim);
}
return 0;
}
输出五次结果:Hello World How Are You
`strtok()` 函数会将原始字符串按照分隔符进行分割,并返回指向分割后的子字符串的指针。需要注意的是,`strtok()` 函数在后续调用时,第一个参数要传入 `NULL`,以继续切割剩余的字符串。同时,原始字符串会被修改,将分隔符替换为结束符 `\0`。
3. 函数说明:chdir()用来将当前的工作目录改变成以参数path 所指的目录.
在C语言中,可以使用 `<unistd.h>` 头文件中的 `chdir()` 函数来改变当前工作目录。`chdir()` 函数接受一个参数,即要切换到的目录路径,返回值为整型。以下是一个基本的使用示例:
```c
#include <unistd.h>
#include <stdio.h>
int main() {
if (chdir("/path/to/directory") == 0) {
printf("成功切换到目标目录。\n");
} else {
printf("切换目录失败。\n");
}
return 0;
}
需要注意的是,`chdir()` 函数执行后,程序的当前工作目录将更改为指定的目录。如果切换成功,`chdir()` 函数将返回 0;如果切换失败,将返回-1。你需要根据实际情况,正确处理返回值。
4. remove()是C语言中的函数,一般作用是删除文件。函数原型是int remove(cha r*filename)。filename为要删除的文件名,可以为一目录。如果参数filename 为一文件,则调用unlink()处理;若参数filename 为一目录,则调用rmdir()来处理。成功则返回0,失败则返回-1,错误原因存于errno。
5. int access(const char *filename, int amode),amode参数为0时表示检查文件的存在性,如果文件存在,返回0,不存在,返回-1。
这个函数还可以检查其它文件属性:
0-检查文件是否存在
1-检查文件是否可运行
2-检查文件是否可写访问
4-检查文件是否可读访问
6-检查文件是否可读/写访问
而这个就算这个文件没有读权限,也可以判断这个文件存在于否
存在返回0,不存在返回-1
6. 函数strstr定义: char *strstr(const char *str1, const char *str2);位于头文件“string.h”中。
作用:strstr函数用于判断字符串str2是否为字符串str1的子串,如果是函数返回str2在str1中首次出现的地址,否则返回NULL。