linux socket 实现服务端和客户端的通讯 具有上传和下载 查看等功能

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;
}





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值