一.相关函数
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()以外。
|
例子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];//存放的内容
};
仅供参考.