socket文件传输,可以实现传输不同大小的文件(单个)

//structure_Function.h
#include <stdio.h>

struct data_Interaction
{
	int   count;
	char data_One[128];
	char data_Two[1024];
	char data_Three[1024];
};

//服务端
#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "structure_Function.h"


#define  LS  1
#define  PWD 2
#define  GET 3
#define  CD  4 


int Strcmp(char *s)
{
	if(strcmp(s,"ls")==0){
		return LS;
	}

	if(strcmp(s,"pwd")==0){
		return PWD;
	}
	if(strstr(s,"get")!=NULL){
		return GET;
	}

	if(strstr(s,"cd")!=NULL){
		return CD;
	}
}
char *get_chdir(char *q)
{
	char *t=NULL;
	t=strtok(q," ");
	t=strtok(NULL," ");
	return t;
}
void  get_Des(struct data_Interaction msg,int c_fd)
{
	int fd;
	int size;
	int count=0;
	int remainder=0;
	int w_write;
	int n_read;
	int ret;
	char buf[1024]={0};	
	char *from_GetChdir=NULL;
	FILE *r=NULL;
	ret = Strcmp(msg.data_One);
	printf("msg.data_One:%s\n",msg.data_One);
	memset(msg.data_Two,0,sizeof(msg.data_Two));
	switch(ret){
		case CD :
		from_GetChdir=get_chdir(msg.data_One);
		chdir(from_GetChdir);
		break;

		case LS  :
		case PWD :
		r=popen(msg.data_One,"r");
		fread(msg.data_Two,sizeof(msg.data_Two),1,r);
		write(c_fd,&msg,sizeof(msg));
		break;

		case GET  :
		from_GetChdir=get_chdir(msg.data_One);
		fd  = open(from_GetChdir,O_RDWR,0600);
		size = lseek(fd,0,SEEK_END);
		lseek(fd,0,SEEK_SET);
		memset(msg.data_Three,0,sizeof(msg.data_Three));
		memset(buf,0,sizeof(buf));
		count=size/1024;
		remainder=size%1024;
		if (remainder>0)
		{
			count=count+1;
		}
		for (int i = 0; i < count; i++)
		{
			msg.count=size;
			printf("msg.count:%d\n",msg.count );
			n_read = read(fd,buf,sizeof(buf)-1);
			memset(msg.data_Three,0,sizeof(msg.data_Three));
			strcpy(msg.data_Three,buf);
			memset(buf,0,sizeof(buf));
			w_write = write(c_fd,&msg,sizeof(msg));
		}
		close(fd);
		break;

		default :
		write(c_fd,&msg.data_Two,sizeof(msg.data_Two));
		break;
	}

}
int main(int argc,const char **argv)
{
	struct data_Interaction  s_Data; 
	int c_Fd;
	int s_Fd;
	int s_Bind;
	int s_Listen;
	struct sockaddr_in s_addr;
	struct sockaddr_in c_addr;
	memset(&s_addr,0,sizeof(s_addr));
	memset(&c_addr,0,sizeof(c_addr));
	int len=sizeof(c_addr);
	if(argc !=3)
	{
		perror("why");
		exit(1);
	}
	s_Fd = socket(AF_INET,SOCK_STREAM,0);
	if(s_Fd ==-1 )
	{
		perror("socket");
		exit(1);
	}
	s_addr.sin_family= AF_INET;
	s_addr.sin_port  = htons(atoi(argv[2]));
	inet_aton(argv[1],&s_addr.sin_addr);
	s_Bind = bind(s_Fd,(struct sockaddr *)&s_addr,sizeof(s_addr));
	s_Listen = listen(s_Fd,10);
	while(1){
		c_Fd = accept(s_Fd,(struct sockaddr *)&c_addr,&len);
		if(c_Fd ==-1)
		{
			perror("accept");
			exit(1);
		}
		else{
			if(fork()==0){
				while(1){
					memset(s_Data.data_One,0,sizeof(s_Data.data_One));
					read(c_Fd,&s_Data,sizeof(s_Data));
	             	printf("--->:");
					printf("%s\n",s_Data.data_One);
					printf("--->:");
					get_Des(s_Data,c_Fd);

				}
			}
		}
	}
	close(s_Fd);
	close(c_Fd);
	return 0;
}

//客户端
#include<stdio.h>
#include <unistd.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "structure_Function.h"
#define LLS  1
#define LS   2
#define PPWD 3
#define PWD  4
#define CD   5 
#define LCD  6
#define GET  7 


int Strcmp(char *s)
{
	if(strcmp(s,"lls")==0){
		return LLS;
	}

	if(strcmp(s,"ls")==0){
		return LS;
	}

	if(strcmp(s,"pwd")==0){
		return PWD;
	}
	if(strcmp(s,"ppwd")==0){
		return PPWD;
	}

	if(strstr(s,"get") !=NULL){
		return GET;
	}

	if(strstr(s,"lcd") !=NULL){
		return LCD;
	}

	if(strstr(s,"cd") !=NULL){
		return CD;
	}

}
char *get_chdir(char *cmd)
{
	char *t;
	t=strtok(cmd," ");
	t=strtok(NULL," ");
	return t;
}
void  get_Des(struct data_Interaction msg,int c_fd)
{
	int w_write;
	int fd;
	int ret;
	int n_read;
	char buf[1024]={0};
	char *from_GetChdir;
	ret = Strcmp(msg.data_One);
	memset(msg.data_Two,0,sizeof(msg.data_Two));
	switch(ret){
		case LLS   :
		system("ls");
		break;

		case PPWD  :
		system("pwd");
		break;

		case LS  :
		case PWD :
		write(c_fd,&msg,sizeof(msg));
		recv(c_fd,&msg,sizeof(msg),0);
		printf("from s_read:%s",msg.data_Two);
		break;

		case LCD :
		from_GetChdir=get_chdir(msg.data_One);   
		chdir(from_GetChdir);
		break;

		case CD  :
		write(c_fd,&msg,sizeof(msg));
		break;

		case GET:
		memset(msg.data_Three,0,sizeof(msg.data_Three));
		write(c_fd,&msg,sizeof(msg));
		from_GetChdir=get_chdir(msg.data_One);
		fd = open(from_GetChdir,O_RDWR|O_CREAT,0600);
		while((n_read =  read(c_fd,&msg,sizeof(msg)))>0)
		{
		    printf("msg.count:%d\n",msg.count );
			memset(buf,0,sizeof(buf));
			strcpy(buf,msg.data_Three);
			w_write = write(fd,buf,strlen(buf));
			memset(buf,0,sizeof(buf));
			if(w_write<1023)
			{
				close(fd);
				break;
			}
		}
		break;
		
		default :
		printf("input error:%s\n",msg.data_One);
		break;
	}
}


int main(int argc ,char **argv)
{
	
	int c_Fd;
	struct data_Interaction  c_Data;
	struct sockaddr_in c_addr;
	int len=sizeof(c_addr);
	memset(&c_addr,0,sizeof(c_addr));	
	if(argc !=3)
	{
		perror("why");
		printf("1");
		exit(1);
	}
	c_Fd = socket(AF_INET,SOCK_STREAM,0);
	if(c_Fd ==-1 )
	{
		perror("socket");
		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(c_Fd,(struct sockaddr *)&c_addr,sizeof(c_addr));
	while(1){
		memset(c_Data.data_One,0,sizeof(c_Data.data_One));
		printf("--->:");
		gets(c_Data.data_One);
		printf("--->:");
		get_Des(c_Data,c_Fd);
	}
	close(c_Fd);
	return 0;
}






如有更好的方法,欢迎交流学习。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值