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

相关推荐
优化Henry4 分钟前
学习笔记之关于MME不通问题归纳
运维·网络·学习·5g·信息与通信
Brookty4 分钟前
TCP传输效率衡量、ACK延迟机制与窗口效率介绍
网络·tcp
Winner_hwx10 小时前
华为ICT大赛备赛复习1
服务器·网络·华为
宗介波妞10 小时前
Wireshark 抓取 IEC104 报文:常见异常报文排查与标志位解读
服务器·网络·wireshark
云边云科技_云网融合11 小时前
工业互联网组网方案全景解析:从低延迟网络到安全隔离的四大核心支柱
网络·安全·php
小程序设计11 小时前
linux防火墙研究与实现
网络·安全
数据知道11 小时前
加密流量分析——JA3 指纹、TLS 指纹识别与规避
网络·安全·网络安全·密码学
网硕互联的小客服12 小时前
各个版本的Linux系统如何修改远程端口ssh端口?
linux·运维·服务器·网络
小程序设计12 小时前
Wi-Fi网络监控及无线终端定位系统的研究
网络·安全
Wang's Blog14 小时前
Java框架快速入门: Spring Security+OAuth2之RBAC与角色分层实践
java·网络·spring