5.21作业

#include <header.h>
#define CLI_PORT 8888
#define CLI_IP "192.168.125.101"
#define SER_PORT 69
int run1();
int run2();

int main(int argc, const char *argv[])
{
	while(1)
	{
		printf("****************\n");
		printf("****************\n");
		printf("*****1:下载*****\n");
		printf("*****2:上传*****\n");
		printf("*****3:退出*****\n");
		printf("****************\n");
		printf("****************\n");
		printf("请输入功能:");
		int c;
		scanf("%d",&c);
		getchar();
		switch(c)
		{
		case 1:
			   run1();
			   printf("请输入任意字符进行清屏·:");
			   getchar();
			   system("clear");
			   break;
		case 2:
			   run2();
			   printf("请输入任意字符进行清屏:");
			   getchar();
			   system("clear");
			   ;
			   break;
		case 3:
			   return 0;
			   break;
		}
	}
	return 0;
}
int run1()
{
	char buf2[128];
	printf("请输入你想要下载的文件名字:");
	fgets(buf2,128,stdin);
	buf2[strlen(buf2)-1]='\0';
	int cfd=socket(AF_INET,SOCK_DGRAM,0);
	if(cfd==-1)
	{
		perror("socket");
		return 1;
	}
	//printf("socket success\n");
	struct sockaddr_in cin;
	cin.sin_family=AF_INET;
	cin.sin_port=htons(CLI_PORT);
	cin.sin_addr.s_addr=inet_addr(CLI_IP);
	if(bind(cfd,(struct sockaddr*)&cin,sizeof(cin))==-1)
	{
		perror("bind");
		return 1;
	}
	//printf("bind success\n");
	struct sockaddr_in sin;
	sin.sin_family=AF_INET;
	sin.sin_port=htons(SER_PORT);
	sin.sin_addr.s_addr=inet_addr("192.168.125.94");
	
	char buf[516];
	char rbuf[516];
	short *p1=(short *)buf;
	*p1=htons(1);
	char *p2=buf+2;
	strcpy(p2,buf2);
	char *p3=p2+strlen(p2)+1;
	strcpy(p3,"octet");
	int size=2+strlen(p2)+strlen(p3)+2;
	sendto(cfd,buf,size,0,(struct sockaddr*)&sin,sizeof(sin));
	char ack[4]="";
	int fd=-1;
	fd=open(buf2,O_CREAT|O_WRONLY|O_TRUNC,0666);
	struct sockaddr_in ssin;              //临时端口
	socklen_t addrlen =sizeof(ssin);
	while(1)
	{
		memset(rbuf,0,sizeof(rbuf));
		int ret_val=recvfrom(cfd,rbuf,sizeof(rbuf),0,(struct sockaddr*)&ssin,&addrlen);
		short *p6=(short *)rbuf;
		if(ntohs(*p6)==5)
		{
			char *p7=rbuf+4;
			printf("%s\n",p7);
			return 0;
		}
		char *p4=rbuf+4;
		//int size1=strlen(p4);
		write(fd,rbuf+4,512);
		short *p5=(short *)rbuf;
		*p5=htons(4);
		sendto(cfd,rbuf,4,0,(struct sockaddr*)&ssin,sizeof(ssin));
		if(ret_val<516)
		{
			break;
		}
	}
	short *p8=(short *)rbuf;


	if(ntohs(*p8)==4)
	{
		printf("下载成功\n");
	}

	close(fd);
	close(cfd);

}
int run2()
{
	char buf3[128]; 
	printf("请输入上传文件的路径:");
	fgets(buf3,128,stdin);
	buf3[strlen(buf3)-1]='\0';
	int cfd=socket(AF_INET,SOCK_DGRAM,0);
	if(cfd==-1)
	{
		perror("socket");
		return 1;
	}
	printf("socket success\n");
	struct sockaddr_in cin;
	cin.sin_family=AF_INET;
	cin.sin_port=htons(CLI_PORT);
	cin.sin_addr.s_addr=inet_addr(CLI_IP);
	if(bind(cfd,(struct sockaddr*)&cin,sizeof(cin))==-1)
	{
		perror("bind");
		return 1;
	}
	printf("bind success\n");
	struct sockaddr_in sin;
	sin.sin_family=AF_INET;
	sin.sin_port=htons(SER_PORT);
	sin.sin_addr.s_addr=inet_addr("192.168.125.94");
	
	char buf[516];
	char wbuf[516];
	short *p1=(short *)buf;
	*p1=htons(2);
	char *p2=buf+2;
	strcpy(p2,buf3);
	char *p3=p2+strlen(p2)+1;
	strcpy(p3,"octet");
	int size=2+strlen(p2)+strlen(p3)+2;
	sendto(cfd,buf,size,0,(struct sockaddr*)&sin,sizeof(sin));
	char ack[4]="";
	int fd=-1;
	fd=open(buf3,O_RDONLY);
	struct sockaddr_in ssin;              //临时端口
	socklen_t addrlen =sizeof(ssin);
	int i=1;
	while(1)
	{
		memset(wbuf,0,sizeof(wbuf));
		recvfrom(cfd,wbuf,4,0,(struct sockaddr*)&ssin,&addrlen);
		char *p4=wbuf+4;
		int ret_val=read(fd,wbuf+4,512);
		short *p5=(short *)wbuf;
		*p5=htons(3);
		short *p6=(short *)(wbuf+2);
		*p6=htons(ntohs(*p6)+1);
		sendto(cfd,wbuf,sizeof(wbuf),0,(struct sockaddr*)&ssin,sizeof(ssin));
		if(ret_val<512)
		{
			memset(wbuf,0,sizeof(wbuf));
			break;
		}
	}
	recvfrom(cfd,wbuf,4,0,(struct sockaddr*)&ssin,&addrlen);
	short *p5=(short *)wbuf;
	*p5=htons(3);
	short *p6=(short *)(wbuf+2);
	*p6=htons(ntohs(*p6));
	printf("上传成功\n");

	close(fd);
	close(cfd);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值