实现功能:ls—查看服务端文件
lls—查看本地文件
lcd---进入客户端文件
cd--进入服务端文件
get--下载文件
put--上传文件
服务端代码:
server.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include "config.h"
#include <unistd.h>
#include <fcntl.h>
int get_cmd_type(char *cmd)
{
//int strcmp(const char *s1, const char *s2);
//当s1<s2时,返回为负数;
//当s1=s2时,返回值= 0;
//当s1>s2时,返回正数。
//char *strstr(const char *haystack, const char *needle);
if(!strcmp("ls",cmd)) return LS;
if(!strcmp("quit",cmd)) return QUIT;
if(!strcmp("pwd",cmd)) return PWD;
if(strstr(cmd,"cd")!=NULL) return CD;
if(strstr(cmd,"get")!=NULL) return GET;
if(strstr(cmd,"put")!=NULL) return PUT;
return 100;
}
char *getDesDir(char *cmsg)
{
char *p;
p = strtok(cmsg," ");
p = strtok(NULL," ");
return p;
}
void msg_handle(struct MSG msg,int fd)
{
char dataBuf[128] = {0};
char *file = NULL;
int fdfile;
printf("cmd :%s\n",msg.data);
int ret = get_cmd_type(msg.data);
switch(ret){
case LS:
case PWD:
msg.type = 0;
//FILE * popen ( const char * command , const char * type );
FILE *r = popen(msg.data,"r");
//size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
/*ptr -- 这是指向带有最小尺寸 size*nmemb 字节的内存块的指针。
size -- 这是要读取的每个元素的大小,以字节为单位。
nmemb -- 这是元素的个数,每个元素的大小为 size 字节。
stream -- 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输入流
*/
fread(msg.data,sizeof(msg.data),1,r);
write(fd,&msg,sizeof(msg));
break;
case CD:
msg.type = 1;
char *dir = getDesDir(msg.data)