linux socket 实现服务端和客户端的通讯 具有上传和下载 查看等功能
这是第一次在这个上面写博客,我是一名嵌入式小白 希望在这里记录自己的 转行和学习的经验
服务端代码
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<sys/socket.h>
#include<errno.h>
#include<stdlib.h>
#include<string.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<netinet/in.h>
#include<dirent.h>
void sys_err(char *err)
{
perror(err);
exit(-1);
}
int jude_cmd(char* cmd);
int get_cmd(int fd,char* cmd);
int main(int argc,char **argv)
{
//socket
int ser_fd,clie_fd;
int addlen;
char readbuf[1024];
int n_read;
int n_cmd;
char path[1024];
char path_file[1024];
bzero(readbuf,sizeof(readbuf));
pid_t pid;
ser_fd=socket(AF_INET,SOCK_STREAM,0); //鍒涘缓濂楁帴瀛恠ocket
if(ser_fd==-1)
{
sys_err("sock");
}
//bind
struct sockaddr_in ser_addr; //缁撴瀯浣撻厤缃? struct sockaddr_in clie_addr;
memset(&ser_addr,0,sizeof(ser_addr));
memset(&clie_addr,0,sizeof(clie_addr));
addlen = sizeof(struct sockaddr_in);
ser_addr.sin_family = AF_INET;
ser_addr.sin_port = htons(atoi(argv[2]));
inet_aton(argv[1],&ser_addr.sin_addr);
bind(ser_fd,(struct sockaddr *)&ser_addr,addlen); //娉ㄦ剰缁撴瀯浣撳拰pid 涓嶈鎼炰贡浜?涓嶇劧涓嶆姤閿?閾炬帴涓嶄笂
//listen
listen(ser_fd,100);
while(1)
{
//accept
clie_fd = accept(ser_fd,(struct sockaddr*)&clie_addr,&addlen);
if(clie_fd==-1)
{
sys_err("accept");
}
pid =fork();
wait(NULL);
if(pid==-1)
{
sys_err("pid");
}
else if(pid>0)
{
close(clie_fd);
}
else if(pid==0)
{
printf("clien connect: IP %s ,port %d\n",inet_ntoa(clie_addr.sin_addr),ntohs(clie_addr.sin_port));
while(1)
{
close(ser_fd);
n_read=recv(clie_fd,readbuf,sizeof(readbuf),0);
if(n_read==0)
{
printf("clie quit\n");
return ;
}
printf(" %s %d\n",readbuf,n_read);
get_cmd(clie_fd,readbuf);
memset(readbuf,0,sizeof(readbuf));
}
break;
}
break;
}
}
/*鑾峰彇鎸囦护*/
int get_cmd(int fd,char* cmd)
{
char path[100];
char buff[2014];
char file_buff[1024];
int chdir_num;
memset(buff,0,sizeof(buff));
memset(file_buff,0,sizeof(file_buff));
FILE * popen_str=NULL;
char * token;
char *file_name=NULL;
int file_fd;
int ret= jude_cmd(cmd);
int file_buff_num;
switch(ret)
{
/*鏈嶅姟绔疨WD*/
case 1 :
popen_str=popen("pwd","r");
fread(buff,1,200,popen_str);
write(fd,buff,strlen(buff));
memset(buff,0,sizeof(buff));
break;
/*鏈嶅姟绔疞S*/
case 2 :
popen_str=popen("ls","r");
fread(buff,1,200,popen_str);
write(fd,buff,strlen(buff));
memset(buff,0,sizeof(buff));
break;
/*鏈嶅姟绔疌D*/
case 3:
fflush(stdin);
token=strtok(cmd," ");
token=strtok(NULL," ");
chdir_num = chdir(token);
if(chdir_num==-1)
{
sys_err("chdir");
}
getcwd(path,100);
write(fd,path,sizeof(path));
// write(fd,token,strlen(token));
break;
/*鑾峰彇鏂囦欢*/
case 4:
file_name=strtok(cmd," ");
file_name=strtok(NULL," ");
if(access(file_name,F_OK)==0)
{
// printf("download %s \n",file_name);
// write(fd,file_name,strlen(file_name));
file_fd = open(file_name,O_RDWR);
if(file_fd==-1)
{
sys_err("open file");
}
file_buff_num = read(file_fd,file_buff,1024);
write(fd,file_buff,file_buff_num);
close(file_fd);
}
break;
case 0:
fflush(stdin);
write(fd,"fail cmd",strlen("fail cmd"));
break;
}
}
int jude_cmd(char *cmd)
{
if(!(strcmp("PWD",cmd))==1) return 1;
if(!(strcmp("LS",cmd))==1) return 2;
if((strstr(cmd,"CD"))!=NULL) return 3;
if((strstr(cmd,"GET"))!=NULL) return 4;
return 0;
}
客户端代码
```c
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<string.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdio.h>
char * sencd_name(char * file_name);
int in_cmd(char *cmd);
int func(int c_fd,char *readBuf);
int clie_func(char *message_clie);
int main(int argc,char **argv)
{
char read_data[1024];
int read_num; //璇诲彇鏂囦欢鐨勫瓧鑺傛暟
char clie_data[1024];
char readBuf[1024];
char *file_name=NULL;
int cmd_num;
int c_fd;
int file_fd;
struct sockaddr_in c_addr;
// struct Msg msg;
FILE * ls_str;
if(argc!=3)
{
printf("param is not good\n");
exit(-1);
}
memset(readBuf,0,sizeof(readBuf));
memset(&c_addr,0,sizeof(c_addr));
//1.socket
c_fd = socket(AF_INET,SOCK_STREAM,0);
if(c_fd==-1)
{
perror("sock");
exit(-1);
}
c_addr.sin_family = AF_INET;
c_addr.sin_port = htons(atoi(argv[2]));
inet_aton(argv[1],&c_addr.sin_addr);
//connect
if(connect(c_fd,(struct sockaddr*)&c_addr,sizeof(struct sockaddr))==-1){
perror("connect");
exit(-1);
}
printf("connect...\n");
while(1)
{
// read(0,readBuf,sizeof(readBuf));
/*璇诲彇鎸囦护鍐呭*/
gets(readBuf);
/*鍒ゆ柇杩斿洖鍊?/
cmd_num=in_cmd(readBuf);
switch(cmd_num)
{
case 1:
case 2:
case 3:
func(c_fd,readBuf);
break;
/*涓嬭浇鏈嶅姟绔枃浠?/
case 4:
// memset(&clie_data,0,sizeof(clie_data));
write(c_fd,readBuf,strlen(readBuf));
read_num=read(c_fd,read_data,1024);
printf("宸茶幏鍙朶n");
printf("read %d bit\n",read_num);
printf("%s\n",read_data);
/*鑾峰彇鏂囦欢鍚嶅瓧open鍚庡啓鍏ヨ鍙栧埌鏁版嵁*/
file_name= sencd_name(readBuf);
file_fd = open(file_name,O_RDWR|O_CREAT,0666);
if(file_fd==-1)
{
perror("creat fail");
exit(-1);
}
write(file_fd,read_data,read_num);
close(file_fd);
memset(&clie_data,0,sizeof(clie_data));
break;
/*涓婁紶鏂囦欢*/
case 5:
write(c_fd,"nihao",strlen("nihao"));
// read(c_fd,readBuf,20);
// printf("%s",readBuf);
// write(c_fd,readBuf,strlen(readBuf));
break;
// printf("fasong mingzhi");
/* file_name = sencd_name(readBuf);
read(c_fd,readBuf,10); //鍒ゆ柇鏈嶅姟绔湁涔堟敹鍒? if(access(file_name,F_OK)==0)
{
memset(&clie_data,0,sizeof(clie_data));
file_fd = open(file_name,O_RDONLY);
if(file_fd==-1)
{
printf("wenjian fail");
}
printf("wenjian yijingdakai");
*/
/*璇诲彇鏂囦欢 澶у皬*/
/* read_num = read(file_fd,read_data,sizeof(read_data));
write(c_fd,read_data,read_num);
close(file_fd);
memset(&clie_data,0,sizeof(clie_data));
}
else printf("not this file\n ");
*/
/*瀹㈡埛绔痩s */
case 6: ls_str =popen("ls","r");
memset(&clie_data,0,strlen(clie_data));
fread(clie_data,1,1000,ls_str);
clie_func(clie_data);
memset(&clie_data,0,strlen(clie_data));
break;
/*瀹㈡埛绔痯wd*/
case 7:
ls_str =popen("pwd","r");
fread(clie_data,1,1000,ls_str);
clie_func(clie_data);
memset(&clie_data,0,strlen(clie_data));
break;
/*瀹㈡埛绔痗d*/
case 8:
// file_name = strtok(readBuf," ");
//file_name = strtok(NULL," ");
file_name = sencd_name(readBuf);
chdir(file_name);
getcwd(clie_data,1000);
clie_func(clie_data);
memset(&clie_data,0,strlen(clie_data));
break;
case 0:
printf("fail cmd\n");
break;
}
}
close(c_fd);
return 0;
}
int in_cmd(char *cmd)
{
if(!(strcmp("PWD",cmd))==1) return 1;
if(!(strcmp("LS",cmd))==1) return 2;
if((strstr(cmd,"CD"))!=NULL) return 3;
if((strstr(cmd,"GET"))!=NULL) return 4;
if((strstr(cmd,"PUT"))!=NULL) return 5;
if(!(strcmp("ls",cmd))==1) return 6;
if(!(strcmp("pwd",cmd))==1) return 7;
if((strstr(cmd,"cd"))!=NULL) return 8;
return 0;
}
/*鎵撳嵃浠庢湇鍔$璇诲彇鍒版暟鎹?/
int func(int c_fd,char *fun_cmd)
{
int n_read;
// fflush(stdin);
/*鍙戦€佹寚浠ょ粰鏈嶅姟绔?/
// send(c_fd,fun_cmd,strlen(readBuf),0);
send(c_fd,fun_cmd,strlen(fun_cmd),0);
/*浠庢湇鍔$璇诲彇鏁版嵁*/
n_read=recv(c_fd,fun_cmd,1024,0);
printf("**************鏈嶅姟绔?*****************\n");
printf("\n");
// printf("%s\n",fun_cmd);
write(1,fun_cmd,n_read);
printf("\n");
printf("**************************************\n");
fflush(stdout);
}
/*鎵撳嵃瀹㈡埛绔殑淇℃伅*/
int clie_func(char *message_clie)
{
printf("**************瀹㈡埛绔?*****************\n");
printf("%s\n",message_clie);
printf("**************************************\n");
fflush(stdout);
}
char * sencd_name(char * file_name)
{
char *name=NULL;
name = strtok(file_name," ");
name = strtok(NULL," ");
return name;
}