当前位置: 首页 > news >正文

8.18作业

1.基于UDP的TFTP文件传输

#include <25061head.h>
#define SER_IP "192.168.108.192"
#define SER_PORT 69
#define CLI_IP "192.168.109.126"
#define CLI_PORT 9999int main(int argc, const char *argv[])
{int cfd=socket(AF_INET,SOCK_DGRAM,0);if(-1==cfd){ERR_MSG("socket error");}printf("socket success cfd=%d\n",cfd);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){ERR_MSG("bind error");}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(SER_IP);socklen_t addrlen=sizeof(sin);char msgbuf[516]="";char filename[256]="";printf("请输入下载的文件名:");scanf("%s",filename);short *p1=msgbuf;*p1=htons(1);char *p2=msgbuf+2;strcpy(p2,filename);char *p4=p2+strlen(p2)+1;strcpy(p4,"octet");int msglen=2+strlen(p2)+strlen(p4)+2;if(-1==sendto(cfd,msgbuf,msglen,0,(struct sockaddr*)&sin,sizeof(sin))){close(cfd);ERR_MSG("sendto error");}int fd=open(filename,O_WRONLY|O_CREAT|O_TRUNC,0664);if(fd==-1){close(cfd);ERR_MSG("open error");}struct sockaddr_in addr;socklen_t len=sizeof(addr);unsigned short block=0;int res;short opcode;while(1){res=recvfrom(cfd,msgbuf,sizeof(msgbuf),0,(struct sockaddr*)&addr,&len);if(-1==res){close(fd);close(cfd);ERR_MSG("recvfrom error");}opcode=ntohs(*(short*)msgbuf);if(opcode==3){unsigned short block_num=ntohs(*(unsigned short*)(msgbuf+2));if(block_num==block+1){block=block_num;int datalen=res-4;ssize_t w=write(fd,msgbuf+4,datalen);if(w<0){close(fd);close(cfd);ERR_MSG("write error");return -1;}*(short*)msgbuf=htons(4);*(unsigned short*)(msgbuf+2)=htons(block);if(sendto(cfd,msgbuf,4,0,(struct sockaddr*)&addr,len)==-1){close(fd);close(cfd);ERR_MSG("sendto error");return -1;}if(datalen<512){printf("下载完成\n");close(fd);return 0;}}else if(block_num==block){*(short*)msgbuf=htons(4);*(unsigned short*)(msgbuf+2)=htons(block);if(-1==sendto(cfd,msgbuf,4,0,(struct sockaddr*)&addr,len)){close(fd);close(cfd);ERR_MSG("sendto error");return -1;}}else{printf("error\n");}}else if(opcode==5){unsigned short error_code=ntohs(*(unsigned short*)(msgbuf+2));char *error_msg=msgbuf+4;printf("错误:%d-%s\n",error_code,error_msg);close(fd);close(cfd);return -1;}else{printf("未知:%d\n",opcode);close(fd);close(cfd);return -1;}}close(cfd);return 0;
}

2.

http://www.lryc.cn/news/624865.html

相关文章:

  • Python实战--基于Django的企业资源管理系统
  • 嵌入式学习硬件I.MX6ULL(五)按键 中断 GIC OCP原则
  • seuratv4数据结构
  • 软考 系统架构设计师系列知识点之杂项集萃(129)
  • 【数模国奖冲刺】备赛过程中的常见问题
  • Jmeter对图片验证码的处理
  • vue3 + antd实现简单的图片点开可以缩小放大查看
  • 视觉语言导航(4)——强化学习的三种方法 与 优化算法 2.43.4
  • BeeWorks 私有化会议系统:筑牢企业会议安全防线,赋能高效协同
  • Go并发编程-goroutine
  • 私有化部署本地大模型+function Calling+本地数据库
  • 【秋招笔试】2025.08.17字节跳动秋招机考真题
  • 技术赋能安全:智慧工地构建城市建设新防线
  • IB数学课程知识点有哪些?IB数学课程辅导机构怎么选?
  • [系统架构设计师]未来信息综合技术(十一)
  • 【秋招笔试】2025.08.17大疆秋招机考第一套
  • C++ STL容器相关操作的复杂度分析
  • FPGA驱动量子革命:微美全息(NASDAQ:WIMI)实现数字量子计算关键验证
  • 认证授权系统设计
  • redis-集成prometheus监控(k8s)
  • 【K8s】harbor安装与推送镜像
  • 中断线程化
  • 虚幻基础:动作时间窗
  • 徕芬的冰火两重天:增长困局,转型阵痛还是衰落前奏?
  • SQL注入防御
  • 【168页PPT】IBM五粮液集团数字化转型项目实施方案建议书(附下载方式)
  • 力扣2道dp
  • Dijkstra和多层图 0
  • [NSSCTF 2022 Spring Recruit]rrrsssaaa
  • 决策树学习报告