tcp上传下载

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<string.h>
#include<dirent.h>
#include<fcntl.h>
#include<errno.h>
#define errlog(errmsg) do{\
						perror(errmsg);\
						exit(-1);\
						}while(0)
#define N 32
 
int start_up(struct sockaddr_in serveraddr);
void do_get(struct sockaddr_in serveraddr,char *filename);
void do_put(struct sockaddr_in serveraddr,char *filename);
 
int main(int argc, const char *argv[])
{
	char buf[N] = {};
	int ret;
 
	struct sockaddr_in serveraddr;
 
	serveraddr.sin_family = AF_INET;
	serveraddr.sin_port = htons(atoi(argv[2]));
	serveraddr.sin_addr.s_addr = inet_addr(argv[1]);
 
	while(1)
	{
		puts("****************************");
		puts("*      get filename       * ");
		puts("*      put filename       * ");
		puts("****************************");
		printf("input:");
		fgets(buf,N,stdin);
		buf[strlen(buf) - 1] = '\0';
				
		if(strncmp(buf,"get ",4) !=0 && strncmp(buf,"put ",4) != 0)
		{
			puts("error cmd");
			continue;
		}
	
		printf("----In client-----filename : %s\n",buf + 4);
		switch(buf[0])
		{
			case 'g':
				do_get(serveraddr,buf + 4);   	//从第四位开始
				break;
			case 'p':
				do_put(serveraddr, buf + 4);	//从第四位开始
				break;
			default:
				puts("error cmd");
				break;
		}
	}

	return 0;
}
 
int start_up(struct sockaddr_in serveraddr)
{
	int sockfd;
	socklen_t addrlen = sizeof(serveraddr);
 
	sockfd = socket(AF_INET,SOCK_STREAM,0);
	if(sockfd < 0)
	{
		errlog("fail to sockfd");
	}
 
	if(connect(sockfd,(struct sockaddr *)&serveraddr,addrlen) < 0)
	{
		errlog("fail to connect");
	}
	return sockfd;
}
 
void do_get(struct sockaddr_in serveraddr, char *filename)
{
	int sockfd = start_up(serveraddr);			//建立链接
	int ret;
	char buf[N] = {};
	int fd;
 
	strcat(strcpy(buf,"get "),filename);
	printf("------In do_get of client----%s\n",buf);
	send(sockfd,buf,N,0);						//发送buf数据   put 1234.txt  

	ret = recv(sockfd,buf,N,0);
	if(ret < 0)
	{
		errlog("fail to recv");
	}
	else if(ret == 0)
	{
		puts("the server is shutdown");
		exit(1);
	}
	else
	{
		if(strncmp(buf,"N",1) == 0)
		{
			printf("%s does not exist\n",filename);
			return;
		}
		fd = open(filename,O_WRONLY|O_CREAT|O_TRUNC,0666);
		if(fd < 0)
		{
			errlog("fail to open");
		}
		while(1)
		{
			ret = recv(sockfd,buf,N,0);
			if(ret < 0)
			{
				errlog("fail to recv");
			}
			else if(ret == 0)
			{
				puts("GET OVER");
				break;
			}
			else
			{
				write(fd,buf,ret);
			}
		}
	}
}
 
void do_put(struct sockaddr_in serveraddr,char *filename)	
{
	int fd;
	char buf[N]={};
	int ret;
	
	int sockfd = start_up(serveraddr);			//建立链接
    
	fd = open(filename,O_RDONLY);
	if(fd < 0)
	{
	 	if(errno == ENOENT)
		{
			printf("%s does not exist\n",filename);
			return;
		}
		else
		{
			errlog("fail to open\n");
		}
	}
	else
	{
		strcat(strcpy(buf,"put "),filename);
		printf("------In do_put of client 1111----%s\n",buf);
	    send(sockfd,buf,N,0);					//发送buf数据  put 1234.txt
 
	    strcpy(buf,filename);
		printf("------In do_put of client 2222----%s\n",buf);
		send(sockfd,buf,N,0);	
		
    	while(1)
		{
			ret = read(fd,buf,N);
			if(ret < 0)
			{
				errlog("fail to read");
			}
			else if(ret == 0)
			{
				puts("upload OVER");
				break;
			}
			else
			{
				send(sockfd,buf,ret,0);
			}
		}
 
	}
		
}

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<string.h>
#include<dirent.h>
#include<fcntl.h>
#include<errno.h>
 
#define errlog(errmsg) do{\
	perror(errmsg);\
	exit(-1);\
}while(0)
#define N 32
 

void do_get(int acceptfd,char *filename);
void do_put(int acceptfd,char *filename);
 
int main(int argc, const char *argv[])
{
	int sockfd,acceptfd;
	struct sockaddr_in serveraddr,clientaddr;
	socklen_t addrlen = sizeof(serveraddr);
	char buf[N] = {};
	int ret;
 
	serveraddr.sin_family = AF_INET;
	serveraddr.sin_port = htons(atoi(argv[2]));
	serveraddr.sin_addr.s_addr = inet_addr(argv[1]);
 
	if((sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0)				//建立连接
	{
		errlog("fail to socket");
	}
 
	if(bind(sockfd,(struct sockaddr *)&serveraddr,addrlen) < 0)     //绑定
	{
		errlog("fail to bind");
	}
 
	if(listen(sockfd,5) < 0)										//监听
	{
		errlog("fail to listen");
	}
 
	while(1)
	{
	
		if((acceptfd = accept(sockfd,(struct sockaddr *)&clientaddr,&addrlen)) < 0)   //接收连接请求
		{
			errlog("fail to accept");
		}
		puts("accept success In server waiting  for client...........\n");

		ret = recv(acceptfd,buf,N,0);												//接收数据
		printf("In server ....ret....%d\n",ret);
		printf("In server ....recv buf.....%s\n",buf);

		if(ret < 0)
		{
			errlog("fail to recv");
		}
		else if(ret == 0)
		{
			puts("%s:%d is disconnected");
			continue;
		}

		puts("begin   switch............\n");
		switch(buf[0])
		{
		case 'g':
			do_get(acceptfd,buf + 4);
			break;
		case 'p':
			do_put(acceptfd,buf + 4);
			break;
		default:
			puts("error cmd");
			break;
		}
		close(acceptfd);
	}
	return 0;
}

 
void do_get(int acceptfd,char *filename)
{
	int fd;
	char buf[N] = {};
	int ret;
 
	fd = open(filename,O_RDONLY);
	if(fd < 0)
	{
		if(errno == ENOENT)
		{
			buf[0] = 'N';
			send(acceptfd,buf,N,0);
			return;
		}
		else
		{
			errlog("fail to open");
		}
	}
	else
	{
		buf[0] = 'Y';
		send(acceptfd,buf,N,0);
	}
 
	while(1)
	{
		ret = read(fd,buf,N);
		if(ret < 0)
		{
			errlog("fail to read");
		}else if(ret == 0)
		{
			break;
		}else{
			send(acceptfd,buf,ret,0);
		}
	}
}
 
void do_put(int acceptfd,char *filename)
{
	int ret;
	char buf[N] = {};
	int fd;
 
	fd = open(filename,O_WRONLY|O_CREAT,0666); //creat file
	if(fd < 0)
	{
		errlog("fail to open");
	}
	while(1)
	{
		ret = recv(acceptfd,buf,sizeof(buf),0);  //recv file
		printf("------In do_put of server ----%s\n",buf);
		if(ret < 0)
		{
			errlog("fail to upload");
		}
		else if(ret == 0)
		{
			puts("upload sucess!");
			break;
		}
		else
		{
			write(fd,buf,ret);
		}
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值