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

相关推荐
JJJJ_iii22 分钟前
【深度学习03】神经网络基本骨架、卷积、池化、非线性激活、线性层、搭建网络
网络·人工智能·pytorch·笔记·python·深度学习·神经网络
海阳宜家电脑34 分钟前
SQL Server连接字符串
服务器·网络
努力学习的小廉1 小时前
深入了解linux网络—— 自定义协议(上)
linux·服务器·网络
要做朋鱼燕2 小时前
【AES加密专题】1.AES的原理详解和加密过程
运维·网络·密码学·c·加密·aes·嵌入式工具
破坏的艺术4 小时前
DNS 加密协议对比:DoT、DoH、DoQ
网络·dns
feifeigo1234 小时前
MATLAB的无线传感器网络(WSN)算法仿真
网络·算法·matlab
爱吃汽的小橘5 小时前
异步串口通信和逻辑分析仪
运维·服务器·网络·单片机·嵌入式硬件·fpga开发
2503_924806857 小时前
海外IP的适用业务范围
网络·网络协议·tcp/ip
Hello.Reader7 小时前
Flink State V2 实战从同步到异步的跃迁
网络·windows·flink
mobai78 小时前
华为NetEngine 8000 M1A路由器配置
网络·华为·智能路由器