1.17 day4 IO网络编程

用udp实现tftp下载和上传功能

cpp 复制代码
#include <myhead.h>
#define PORT 69
#define IP "192.168.122.24"
int shangchuan(int sfd,struct sockaddr_in sin,socklen_t socklen)
{
	int cfd=-1;
	if((cfd=open("./01udpk.c",O_RDONLY))==-1)
	{
		perror("open error");
		return -1;
	}

	char rbuf[516]="";
	short a=1;
	int SIZE=sprintf(rbuf,"%c%c%s%c%s%c",0,2,"./01udpk.c",0,"octet",0);
	sendto(sfd,rbuf,SIZE,0,(struct sockaddr*)&sin,sizeof(sin));
	while(1)
	{
		recvfrom(sfd,rbuf,sizeof(rbuf),0,(struct sockaddr*)&sin,&socklen);
		bzero(rbuf,sizeof(rbuf));
		int sre=read(cfd,rbuf+4,512);
		if(sre==0)
		{
			break;
		}
		short *a1=(short*)rbuf;
		*a1=htons(3);
		short *a2=(short*)(rbuf+2);
		*a2=htons(a++);

		sendto(sfd,rbuf,sre+4,0,(struct sockaddr*)&sin,sizeof(sin));

	}
	close(cfd);
}
int xiazai(int sfd,struct sockaddr_in sin,socklen_t socklen)
{
	int fd=-1;
	if((fd=open("./helltaker.bmp",O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)
	{
		perror("open error");
		return -1;
	}
	char buf[516]="";
	char ack[4]="";
	int len=sprintf(buf,"%c%c%s%c%s%c",0,1,"./helltaker.bmp",0,"octet",0);
	sendto(sfd,buf,len,0,(struct sockaddr*)&sin,sizeof(sin));
	while(1)
	{
		bzero(buf,sizeof(buf));
		int res=recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&sin,&socklen);
		if(res<516)
		{
			write(fd,buf+4,res-4);
			break;
		}
		write(fd,buf+4,res-4);
		short *q1=(short *)(buf+2);

		short *p4=(short *)ack;
		*p4=htons(4);
		short *p5=(short *)(ack+2);
		*p5=*q1;
		sendto(sfd,ack,4,0,(struct sockaddr*)&sin,sizeof(sin));

	}
	printf("下载完成\n");
	close(fd);

}
int main(int argc, const char *argv[])
{

	int sfd=-1;
	if((sfd=socket(AF_INET,SOCK_DGRAM,0))==-1)
	{
		perror("socket error");
		return -1;
	}

	int reuse=-1;
	if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1)
	{
		perror("setsockopt error");
		return -1;
	}

	struct sockaddr_in sin;
	sin.sin_family=AF_INET;
	sin.sin_port=htons(PORT);
	sin.sin_addr.s_addr=inet_addr(IP);
	socklen_t socklen=sizeof(sin);
	int num;
	while(1)
	{
		printf("\t\t=======1.下载=======\n");
		printf("\t\t=======2.上传=======\n");
		printf("\t\t=======3.退出=======\n");
		printf("请输入功能:");
		scanf("%d",&num);
		while(getchar()!='\n');
		switch(num)
		{
		case 1:
			{
				xiazai(sfd,sin,socklen);
			}
			break;
		case 2:
			{
				shangchuan(sfd,sin,socklen);
			}
			break;
		case 3 :
			goto END;
		default:printf("输入有误,请重新输入\n");
		}
		printf("按任意键清屏\n");
		while(getchar()!='\n');
		system("clear");
	}
END:

	close(sfd);
	return 0;
}

相关推荐
小林熬夜学编程25 分钟前
【Linux网络编程】第十四弹---构建功能丰富的HTTP服务器:从状态码处理到服务函数扩展
linux·运维·服务器·c语言·网络·c++·http
Hacker_Fuchen27 分钟前
天融信网络架构安全实践
网络·安全·架构
上海运维Q先生30 分钟前
面试题整理15----K8s常见的网络插件有哪些
运维·网络·kubernetes
ProtonBase40 分钟前
如何从 0 到 1 ,打造全新一代分布式数据架构
java·网络·数据库·数据仓库·分布式·云原生·架构
fantasy_arch10 小时前
CPU性能优化-磁盘空间和解析时间
网络·性能优化
是Dream呀12 小时前
Python从0到100(七十八):神经网络--从0开始搭建全连接网络和CNN网络
网络·python·神经网络
kaixin_learn_qt_ing13 小时前
了解RPC
网络·网络协议·rpc
安全小王子14 小时前
Kali操作系统简单介绍
网络·web安全
Hacker_LaoYi15 小时前
【漏洞分析】DDOS攻防分析(四)——TCP篇
网络·tcp/ip·ddos
爱吃水果蝙蝠汤15 小时前
DATACOM-IP单播路由(BGP)-复习-实验
网络·网络协议·tcp/ip