网络编程ftp云盘

一.相关函数 

1.strcmp函数

int strcmp(const char *str1, const char *str2)

把 str1 所指向的字符串和 str2 所指向的字符串进行比较

 如果返回值小于 0,则表示 str1 小于 str2。

如果返回值大于 0,则表示 str1 大于 str2。

如果返回值等于 0,则表示 str1 等于 str2。

2.strstr函数

 char *strstr(const char *haystack, const char *needle) 

在字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 '\0'。

返回值:该函数返回在 haystack 中第一次出现 needle 字符串的位置,如果未找到则返回 null。

3.popen函数

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

popen()会调用fork()产生子进程,然后从子进程中调用/bin/sh -c来执行参数command的指令。参数type可使用“r”代表读取,“w”代表写入。依照此type值,popen()会建立管道连到子进程的标准输出设备或标准输入设备,然后返回一个文件指针。随后进程便可利用此文件指针来读取子进程的输出设备或是写入到子进程的标准输入设备中。此外,所有使用文件指针(FILE*)操作的函数也都可以使用,除了fclose()以外。

  • 如果 type 为 r,那么调用进程读进 command 的标准输出。
  • 如果 type 为 w,那么调用进程写到 command 的标准输入。

例子1

#include <stdio.h>
#include <string.h>
int main()
{
        FILE *fp;
        char buffer[1024];
        memset(buffer,0,sizeof(buffer));
        fp = popen("ls", "r");
        fread(buffer,sizeof(buffer),1,fp);
        printf("%s", buffer);
        pclose(fp);

}

 运行结果如下 

 

 4.strtok函数(分割字符串)

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

str -- 要被分解成一组小字符串的字符串。

delim -- 包含分隔符的 C 字符串。

该函数返回被分解的第一个子字符串,如果没有可检索的字符串,则返回一个空指针 

例子2

#include <stdio.h>
#include <string.h>
int main()
{
        char a[128]="cd aa bb";
        //char *a = "xiao wei !!!";
        char *p;
        printf("a = %s\n",a);

        p = strtok(a," ");
        printf("p1 = %s\n",p);
        printf("a = %s\n",a);

        p = strtok(NULL," ");
        printf("p2 = %s\n",p);
        printf("a = %s\n",a);

        p = strtok(NULL," ");
        printf("p3 = %s\n",p);
        printf("a = %s\n",a);

        p = strtok(NULL," ");
        printf("p4 = %s\n",p);
        printf("a = %s\n",a);
        return 0;
}

运行结果: 

5.chdir函数

int chdir(const char * path);

函数说明:chdir()用户将当前的工作目录改变成以参数路径所指的目录。

返回值执行成功则返回0,失败返回-1,errno为错误代码。 

 6.fflush(stdout);清空缓存区.

7.access函数

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

pathname 是文件的路径名+文件名

mode:指定access的作用,取值如下

 F_OK 值为0,判断文件是否存在
 
X_OK 值为1,判断对文件是可执行权限
 
W_OK 值为2,判断对文件是否有写权限
 
R_OK 值为4,判断对文件是否有读权限
 
注:后三种可以使用或“|”的方式,一起使用,如W_OK|R_OK

返回值:成功为0,失败为-1

二、具体代码

 服务器:

#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <netinet/in.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include "jgt2.h"
int cmd_charge(char *cmd)
{
        if(!strcmp(cmd,"ls"))           return LS;
        if(!strcmp(cmd,"pwd"))          return PWD;
        if((strstr(cmd,"cd"))!=NULL)    return CD;
        if((strstr(cmd,"get"))!=NULL)   return GET;
        if((strstr(cmd,"put"))!=NULL)   return PUT;
        if(!strcmp(cmd,"quit"))           return QUIT;
}
char *cmd_dir(char *data)
{
        char *p;
        p = strtok(data," ");
        p = strtok(NULL," ");
        return p;
}
void cmd_handle(struct Msg msg,int fd)
{

        printf("cmd is:%s\n",msg.cmd);
        int ret=cmd_charge(msg.cmd);
        char fdbuf[1024]={0};
        printf("ret is :%d\n",ret);
        FILE *r=NULL;
        char *file=NULL;
        int fdfile;
        char cmd[128]={0};
        char *dir=NULL;
        switch(ret)
        {
                case LS:
                case PWD:
                        r=popen(msg.cmd,"r");
                        fread(msg.secondBuf,sizeof(msg.secondBuf),1,r);
                        write(fd,&msg,sizeof(msg));
                        break;
                case CD:
                        msg.type = 6;
                        dir=cmd_dir(msg.cmd);
                        printf("dir is %s \n",dir);
                        chdir(dir);
                        break;
                case GET:

                        //printf("msg.cmd is %s\n",msg.cmd);
                        strcpy(cmd,msg.cmd);//为了分割字符串后不改变原来的指令
                        file=cmd_dir(cmd);
                //      printf("msg.cmd is %s\n",msg.cmd);
                        if(access(file,F_OK)==-1)//判断文件是否存在
                        {
                        strcpy(msg.secondBuf,"not file");
                        write(fd,&msg,sizeof(msg));
                        }else{
                        msg.type=DOFILE;

                        fdfile=open(file,O_RDWR);
                        read(fdfile,fdbuf,sizeof(fdbuf));
                        close(fdfile);
                //      strcpy(msg.cmd,msg.cmd);
                        printf("msg.cmd is %s\n",msg.cmd);
                        strcpy(msg.secondBuf,fdbuf);
                        write(fd,&msg,sizeof(msg));
                        printf("get ok \n");
                        }
                        break;
                case PUT:
                        printf("msg.cmd is %s\n",msg.cmd);
                        dir=cmd_dir(msg.cmd);
                        fdfile=open(dir,O_RDWR|O_CREAT,0600);
                        write(fdfile,msg.secondBuf,sizeof(msg.secondBuf));
                        close(fdfile);

                        break;
                case QUIT:
                        exit(-1);

                        break;
        }

}
int main(int argc,char **argv)
{
        int s_fd;
        int c_fd;
        struct sockaddr_in s_addr;
        struct sockaddr_in c_addr;
        struct Msg msg;
        memset(&s_addr,0,sizeof(struct sockaddr_in));
        memset(&c_addr,0,sizeof(struct sockaddr_in));
        memset(&msg,0,sizeof(msg));
        int n_read;
        //1.socket
        s_fd=socket(AF_INET,SOCK_STREAM,0);

        //2.bind
        s_addr.sin_family=AF_INET;
        s_addr.sin_port=htons(atoi(argv[2]));
        inet_aton(argv[1],&s_addr.sin_addr);
        bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));
        //3.listen
        listen(s_fd,10);
        //4.accept
        int clan=sizeof(struct sockaddr_in);

        while(1){
                c_fd=accept(s_fd,(struct sockaddr *)&c_addr,&clan);
                if(c_fd == -1){
                perror("accept");
                }
                printf("get connect:%s\n",inet_ntoa(c_addr.sin_addr));
                if(fork()==0){
                        //5.read
                        while(1){
                                memset(msg.cmd,0,sizeof(msg.cmd));
                                memset(msg.secondBuf,0,sizeof(msg.secondBuf));
                                n_read=read(c_fd,&msg,sizeof(msg));
                                if(n_read == 0){
                                printf("connect down!\n");
                                break;
                                }else if(n_read > 0){
                                cmd_handle(msg,c_fd);
                        }
                        }

                }
        }
        close(c_fd);
        close(s_fd);
        return 0;
}


                                                                             

客户端:

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include "jgt2.h"
int cmd_change(char *cmd)
{
        if(strstr(cmd,"lcd"))           return LCD;
        if(strcmp(cmd,"ls")==0)         return LS;
        if(strcmp(cmd,"pwd")==0)        return PWD;
        if(strstr(cmd,"cd")!=NULL)      return CD;
         if((strstr(cmd,"get"))!=NULL)  return GET;
        if(strcmp(cmd,"lls")==0)        return LLS;
         if((strstr(cmd,"put"))!=NULL)  return PUT;
        if(!strcmp(cmd,"quit"))         return QUIT;
        if(!strcmp(cmd,"lpwd"))         return LPWD;
}
char *cmd_dir(char *data)
{
        char *p;
        p = strtok(data," ");
        p = strtok(NULL," ");
        return p;
}

int cmd_cz(struct Msg msg,int fd)
{
        int ret;
        char *dir=NULL;
        char readbuf[1024]={0};
        char cmd[128]={0};
        ret=cmd_change(msg.cmd);
        switch(ret)
        {
                case LS:
                case PWD:
                case CD:
                //      msg.type=0;
                        write(fd,&msg,sizeof(msg));
                        break;
                case GET:
                        msg.type=2;
                        write(fd,&msg,sizeof(msg));
                        break;
                case LLS:
                        system("ls");
                        break;
                case LPWD:
                        system("pwd");
                        break;
                case LCD:
                        msg.type=8;
                        dir=cmd_dir(msg.cmd);
                        chdir(dir);
                        break;
                case PUT:
                        strcpy(cmd,msg.cmd);
                        dir=cmd_dir(cmd);
                        if(access(dir,F_OK)==-1)
                        {
                        printf("no file\n");
                        }else
                        {
                        int fdfile=open(dir,O_RDWR);
                        read(fdfile,readbuf,sizeof(readbuf));
                        close(fdfile);

                        strcpy(msg.secondBuf,readbuf);
                        write(fd,&msg,sizeof(msg));
                        }
                        break;
                case QUIT:
                        write(fd,&msg,sizeof(msg));
                        close(fd);
                        exit(-1);
                        break;
        }
        return ret;
}
void cmd_print(struct Msg msg,int fd)
{
        int n_read;
        int newfilefd;
//      printf("msg.cmd is:%s \n",msg.cmd);
        n_read=read(fd,&msg,sizeof(msg));
        if(n_read==0){
                perror("WHY");
        }
        if(msg.type==DOFILE)
        {
                printf("in DOFILE\n");
        //      printf("msg.cmd is:%s \n",msg.cmd);
                char *p = cmd_dir(msg.cmd);
                newfilefd=open(p,O_RDWR|O_CREAT,0666);
                write(newfilefd,msg.secondBuf,strlen(msg.secondBuf));
                fflush(stdout);
        }else{
        printf("----------------------\n");
        printf("\n%s\n",msg.secondBuf);
        printf("----------------------\n");
        fflush(stdout);
}
}
int main(int argc,char **argv)
{
        int c_fd;
        struct sockaddr_in c_addr;
        struct Msg msg;
        //1.socket
        c_fd=socket(AF_INET,SOCK_STREAM,0);
        //2.connect
        c_addr.sin_family=AF_INET;
        c_addr.sin_port=htons(atoi(argv[2]));
        inet_aton(argv[1],&c_addr.sin_addr);
        connect(c_fd,(struct sockaddr *)&c_addr,sizeof(struct sockaddr_in));
        while(1){
                                memset(msg.cmd,0,sizeof(msg.cmd));
                                memset(msg.secondBuf,0,sizeof(msg.secondBuf));
                                printf("put: ");
                                gets(msg.cmd);
                                int ret=cmd_cz(msg,c_fd);
                if(ret>IFGO){
                fflush(stdout);
                continue;//退出本次循环,开始下一次循环
                }
                if(ret == -1){
                printf("cmd not \n");
                fflush(stdout);
                continue;
                }

                cmd_print(msg,c_fd);
        }
        return 0;
}

存放数据:jgt2.h

#define LS 0
#define PWD 1
#define GET 2

#define IFGO 3
#define PUT 7
#define LCD 8
#define LLS 5
#define LPWD 4
#define CD 6
#define DOFILE 9
#define QUIT 10
struct Msg
{
        int type;//类型
        char cmd[1024];//指令
        char secondBuf[1024];//存放的内容
};

仅供参考.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值