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

相关推荐
yyuuuzz9 小时前
跨境站点日志时区混乱的排查记录
运维·服务器·网络·云计算·aws·1024程序员节
GlobalInfo9 小时前
全球及中国风电叶片检测机器人行业研究报告(2026版):市场现状、行业前景与占有率分析
运维·网络·人工智能·机器人
运维行者_11 小时前
网络监控工具怎么选?从设备监控到智能运维的能力清单
运维·服务器·开发语言·网络·人工智能·支持向量机·php
2401_8685347811 小时前
陈冲2026年上海纽约大学全英文毕业演讲
服务器·网络
DYWorker00115 小时前
第1课:基于正点原子RK3568开发板读懂Linux内核
linux·运维·网络
Lzg_na16 小时前
数据链路层差错控制使用的算法详解
网络
努力努力再努力wz17 小时前
【C++ 高阶系列】C++ 高性能网络编程:当 Reactor 遇见协程:从 epoll 回调到异步 MySQL,彻底打通任务挂起与恢复
网络·c++·mysql
loulanyue_17 小时前
当AI学会自主攻击与渗透破壁:Agent行为链失控与Mythos级攻防颠覆下的安全范式重构——读CNCC2026第六届网络生态治理论坛实录
网络·人工智能·安全
2401_8685347818 小时前
英语演讲:麻省理工校长2024年毕业典礼演讲
服务器·网络
码完就睡18 小时前
Linux——以太网协议
运维·服务器·网络·1024程序员节