linux网络——ftp云盘

76 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第38天,点击查看活动详情

1、功能

1.1服务端

1.接收客户端指令,实现如下的操作: ls,rm,cd,pwd 上传和下载文件操作(get,put) 断开连接quit

1.2客户端

1.给服务器发送指令,实现相关操作 ls,rm,cd,pwd,get,put

2.客户端自身指令 lls,lrm,lcd,lpwd

3.退出程序指令quit

2、相关API

2.1初始化变量memset

功能:初始化赋值

参数1:任意类型变量,可以是结构体

参数2:赋的初值,常用0或者'\0'

参数3:长度,sizeof可以是变量也可以是数据类型

2.2判断文件是否存在access

int access(const char *pathname, int mode);

返回值:不存在返回-1 参数1:文件名字 参数2:这里用F_OK R_OK 只判断是否有读权限 W_OK 只判断是否有写权限 X_OK 判断是否有执行权限 F_OK 只判断是否存在

2.3执行系统命令popen

FILE *popen(const char *command, const char *type);

功能:执行shell可以获取输出结果,用fread读取结果,可以直接printf输出,也可以写入文件中。屏幕上不会直接打印出来 参数1:命令 参数2:r或w,一般要r

2.4改变当前目录chdir

int chdir(const char *path);

参数:指向目录的指针

2.5字符串分割strtok

char *strtok(char *str, const char *delim);

用法: 第一次调用参数1为字符串str(只能是数组a[],不能是指针类型char*a) 第二次参数1为NULL 原理: 第一次调用把字符串中分割符替换成'\0',返回字符串地址 第二次跳过字符串的第一个\0,返回\0后面的字符串地址 最终原字符串已经被破坏,输出字符串只会输出第一个返回的字符串 参数1:要分割的字符串 参数2:分割符

2.6字符串比较strncmp

int strcmp(const char *s1, const char *s2);

int strncmp(const char *s1, const char *s2, size_t n);
/*例子*/
if(!strncmp("ls",buf,2))                return LS;

返回值:一样返回0,不一样非0 参数1:比较字符串1 参数2:比较字符串2 参数3:比较前几个是否一样 注:为什么不用strcmp,因为strcmp有时候会出错

3、实现思路

服务器 1.创建socket,等待客户端连接 2.有连接fork一个进程,服务器继续等待连接 3.fork的进程read等待信息,做出相应命令 4.read到quit结束进程 客户端 1.socket连接服务器 2.连接成功fork进程,父进程wait等待,子进程gets输入 3.子进程gets输入后传命令到服务器 4.gets到quit退出进程 上传,下载补充 1.做个char* p指针 2.用sleek计算出文件大小 3.malloc给p指针分配内存 4.把内容读到p 5.给服务器/客户端发2次内容,个数和文件内存 6.服务器/客户端malloc分配内存,接收文件内容,然后放到新创建文件