网络 / day04 作业

1. 基于UDP的TFTP文件传输

#include<myhead.h>//上传int do_upload(int cfd, struct sockaddr_in sin)
{//定义变量存储下载请求包char buf[516] = "";//定义变量存储文件名char fileName[40] = "";int rfd = -1;printf("请输入文件名:");scanf("%s", fileName);getchar();if((rfd=open(fileName, O_RDONLY)) == -1){perror("open error");return -1;}//发送读写请求short *ptr_opcode = (short *) buf;char *ptr_filename = (char *) (buf + 2);char *ptr_mode =  ptr_filename + strlen(fileName)+1;*ptr_opcode = htons(2);strcpy(ptr_filename, fileName); strcpy(ptr_mode, "octet");size_t size_req = 2 + strlen(fileName) + 1 + strlen(ptr_mode) + 1;socklen_t socklen = (socklen_t)sizeof(sin);printf("buf=%s\n", buf);if(sendto(cfd, buf, size_req, 0, (struct sockaddr *)&sin, socklen) == -1){perror("sendto error");return -1;}printf("send requtest to svc successfully\n");//recvfrom svc for ack packageshort *ptr_ack = (short *)buf;short *ptr_bnum = ptr_ack + 2;int size_ack = sizeof(ptr_ack) + sizeof(ptr_bnum);bzero(buf, sizeof(buf));recvfrom(cfd, buf, size_ack ,0, (struct sockaddr *)&sin, &socklen);int ack_rcv = ntohs(*ptr_ack);int bnum_rcv = ntohs(*ptr_bnum);printf("1. ack=%d, bnum=%d\n", ack_rcv, bnum_rcv);printf("2. sin_port=%d, sin_ip=%s, buf=%s\n", ntohs(sin.sin_port), inet_ntoa(sin.sin_addr), buf);if(ack_rcv != 4 || bnum_rcv !=0){printf("3. ack error\n");return -1;}char *ptr_data = buf + 4;char rbuf[512] = "";int bnum = 1;while(1){printf("> bnum = %d\n", bnum);bzero(buf, sizeof(rbuf));int res = read(rfd, rbuf, sizeof(rbuf));printf("4.read res=%d,  rbuf=%s\n",res, rbuf);//组装*ptr_opcode = htons(3);*ptr_bnum = htons(bnum);printf("5. *ptr_opcode=%d", ntohs(*ptr_opcode));strcpy(ptr_data, rbuf);printf("6. buf=%s\n", buf);//send to datasendto(cfd, buf, sizeof(buf),0, (struct sockaddr *)&sin, socklen);// recv ack bzero(buf, sizeof(buf));recvfrom(cfd, buf, size_ack ,0, (struct sockaddr *)&sin, &socklen);ack_rcv = ntohs(*ptr_ack);bnum_rcv = ntohs(*ptr_bnum);printf("7. ack=%d, bnum=%d\n", ack_rcv, bnum_rcv);printf("8. sin_port=%d, sin_ip=%s, buf=%s\n", ntohs(sin.sin_port), inet_ntoa(sin.sin_addr), buf);if(ack_rcv != 4 || bnum_rcv != bnum) {printf("9. ack error\n");return -1;}if(res < sizeof(buf) -4){printf("upload finished\n");break;}bnum ++;}close(rfd);close(cfd);return 0;}//实现下载功能
int do_download(int cfd, struct sockaddr_in sin)
{//定义变量存储下载请求包char buf[516] = "";//定义变量存储文件名char fileName[40] = "";int wfd = -1;printf("请输入文件名:");scanf("%s", fileName);getchar();if((wfd=open(fileName, O_WRONLY | O_CREAT | O_TRUNC , 0664 )) == -1){perror("open error");return -1;}//组装请求包short *p1 = (short *)buf;*p1 = htons(1);                 //表明要下载char *p2 = buf+2;           //文件名段strcpy(p2, fileName);char *p4 = p2+strlen(p2)+1;    //模式段strcpy(p4, "octet");int size = 4 + strlen(p2) + strlen(p4);      //要发送数据的大小//向服务器发送下载请求if(sendto(cfd, buf, size, 0, (struct sockaddr*)&sin, sizeof(sin)) == -1){perror("sendto error");return -1;}printf("请求成功\n");//循环接收回复服务器发来的消息while(1){short *popcode = (short *)buf;short *pbnum =(short *)(buf + 2);char *pdata = (char *)(buf + 4);recvfrom(cfd, buf, sizeof(buf), 0,NULL, NULL);//判断操作码if( ntohs(*popcode) == 3 ){int datalen =strlen(pdata);printf("datalen=%d, data=%s\n", datalen, pdata );write(wfd, pdata, datalen );//发送确认*popcode == 4;sendto(cfd, buf, sizeof(short), 0, (struct sockaddr*)&sin, sizeof(sin));if(datalen<512){break;}}}close(wfd);close(cfd);}int main(int argc, const char *argv[])
{if(argc != 2){printf("input error\n");printf("usage:./a.out ip\n");return -1;}//1、创建套接字int cfd = socket(AF_INET, SOCK_DGRAM, 0);if(cfd == -1){perror("socket error");return -1;}//2、填充服务器地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(69);sin.sin_addr.s_addr = inet_addr(argv[1]);int mune = -1;while(1){system("clear");                     //清屏printf("\t\t======1、下载=======\n");printf("\t\t======2、上传=======\n");printf("\t\t======0、退出=======\n");printf("请输入功能:");scanf("%d", &mune);getchar();//多分支选择switch(mune){case 1:{do_download(cfd, sin);}break;case 2:{do_upload(cfd, sin);}break;case 0:goto POS;default:printf("输入功能有误,请重新输入\n");}//阻塞printf("输入任意键,按回车清空:");while(getchar() != '\n');}POS://关闭套接字close(cfd);return 0;
}

有bug待查

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/232853.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c 实现jpeg中的ALI(可变长度整数转换)正反向转换

用于DC的ALI表&#xff1a;DIFF 就是前后两个8X8块DC的差值&#xff0c;ssss就是DIFF值用二进制表示的位数 亮度&#xff0c;与色度的DC都是这种处理的。两个相邻的亮度与亮度比差&#xff0c;色度与色度比差产生DIFF, 扫描开始DIFF等于0。 用于AC ALI表&#xff1a;表中的AC…

喜讯!聚铭网络入选国家信息安全漏洞库(CNNVD)技术支撑单位

近日&#xff0c;国家信息安全漏洞库&#xff08;CNNVD&#xff09;公示2023年度新增技术支撑单位名单。经考核评定&#xff0c;聚铭网络正式入选并被授予《国家信息安全漏洞库&#xff08;CNNVD&#xff09;三级技术支撑单位证书》。 国家信息安全漏洞库&#xff08;CNNVD&am…

解决腾讯云CentOS 6硬盘空间不足问题:从快照到数据迁移

引言&#xff1a; 随着数据的不断增加&#xff0c;服务器硬盘空间不足变成了许多运维人员必须面对的问题。此主机运行了httpd&#xff08;apache服务&#xff09;&#xff0c;提供对外web访问服务,web资源挂载在**/data/wwwroot目录下,http日志存放在/data/wwwlogs目录下&…

11 v-bind指令

概述 v-bind指令可以说是Vue3中最常用的指令之一&#xff0c;使用v-bind&#xff0c;我们几乎能够给任何实现动态的绑定比值。 这里&#xff0c;我们主要演示以下&#xff0c;通过v-bind动态绑定CSS样式。 基本用法 我们创建src/components/Demo11.vue&#xff0c;在这个组…

Python基于joblib的并行计算

文章目录 Python基于joblib的并行计算适用场景使用示例总结爬虫&joblib使用`joblib`的场景注意事项使用实例结论joblib介绍简单示例多参数并行并行时CPU是怎么分配的何时选用并行进程&线程进程和线程之间的关系

JS逆向实战——开发者工具检测

说明&#xff1a;仅供学习使用&#xff0c;请勿用于非法用途&#xff0c;若有侵权&#xff0c;请联系博主删除 作者&#xff1a;zhu6201976 一、背景 在JS逆向领域&#xff0c;Chrome开发者工具是核心&#xff0c;抓包、调试、看调用栈等都离不开它。可以说&#xff0c;逆向人…

RHCE8 资料整理(十)二

RHCE8 资料整理 第 31 章 变量的使用&#xff08;一&#xff09;31.1 手动定义变量31.2 变量文件31.3 字典变量31.4 列表变量31.5 数字变量的运算31.6 注册变量31.7 facts变量 第 31 章 变量的使用&#xff08;一&#xff09; 31.1 手动定义变量 通过vars来定义变量&#xff…

C语言--字符函数与字符串函数

大家好&#xff0c;我是残念&#xff0c;希望在你看完之后&#xff0c;能对你有所帮助&#xff0c;有什么不足请指正&#xff01;共同学习交流 本文由&#xff1a;残念ing 原创CSDN首发&#xff0c;如需要转载请通知 个人主页&#xff1a;残念ing-CSDN博客&#xff0c;欢迎各位…

关于技术标准那些事——第一篇:面纱

突然就冒出来这两个字“面纱”&#xff0c;就拿她来做开篇的标题吧。 想了很久&#xff0c;从检测到全面质量管理&#xff0c;有太多可展开的内容&#xff0c;但是如果不回归到根本&#xff0c;我们会在偏离的轨道上越跑越远&#xff0c;所以还是从了解标准&#xff0c;了解标准…

Java 数据结构篇-实现二叉搜索树的核心方法

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 二叉搜索树的概述 2.0 二叉搜索树的成员变量及其构造方法 3.0 实现二叉树的核心接口 3.1 实现二叉搜索树 - 获取值 get(int key) 3.2 实现二叉搜索树 - 获取最小…

程序流程图的意义(合集)

程序流程图的意义 1、矩形 作用&#xff1a;一般用作要执行的处理(process)&#xff0c;在程序流程图中做执行框。 在axure中如果是画页面框架图&#xff0c;那么也可以指代一个页面。有时候我们会把页面和执行命令放在同一个流程中做说明&#xff0c;这个时候将两类不同的矩形…

RHCE8 资料整理(十)三

RHCE8 资料整理 第 31 章 变量的使用&#xff08;二&#xff09;31.8 内置变量 groups31.9 内置变量 hostvars31.10 内置变量 inventory_hostname31.11 变量过滤器31.11.1 数字类型31.11.2 列表31.11.3 设置变量默认值default31.11.4 字符串相关31.11.5 加密相关 第 31 章 变量…

算法(2)——滑动窗口

前言&#xff1a; 步骤及算法模板&#xff1a; 确定两个指针变量&#xff0c;left0,right0; 进窗口&#xff1a; 判断&#xff1a; 出窗口 更新结果 接下来我们的所用滑动窗口解决问题都需要以上几个步骤。 一、长度最小的子数组 209. 长度最小的子数组 - 力扣&#xff08;L…

Ebullient第一阶段开发小结

一. 简介 距离Ebullient硬件发布已有一段时间&#xff0c;小一个月吧&#xff0c;在这段时间内在努力的编写代码&#xff0c;现在终于完成了第一阶段的功能设计&#xff0c;算是一个小型的样机吧&#xff0c;基本的代码框架基本确定了&#xff0c;相信后续的会快一点(希望如此…

Nodejs 第二十六章(反向代理)

什么是反向代理? 反向代理&#xff08;Reverse Proxy&#xff09;是一种网络通信模式&#xff0c;它充当服务器和客户端之间的中介&#xff0c;将客户端的请求转发到一个或多个后端服务器&#xff0c;并将后端服务器的响应返回给客户端。 负载均衡&#xff1a;反向代理可以根…

前端全栈基础之CSS中margin,padding

一、margin属性 Margin属性有以下一些属性值&#xff1a; 1.margin-top: 设置元素上方的外边距大小&#xff1b; 2.margin-right: 设置元素右侧的外边距大小&#xff1b; 3.margin-bottom: 设置元素下方的外边距大小&#xff1b; 4.margin-left: 设置元素左侧的外边距大小…

二、W5100S/W5500+RP2040之MicroPython开发<DHCP示例>

文章目录 1 前言2 相关网络信息2 .1 简介2.2 DHCP工作原理2.3 DHCP的优点2.4 应用场景 3 WIZnet以太网芯片4 DHCP网络设置示例概述以及使用4.1 流程图4.2 准备工作核心4.3 连接方式4.4 主要代码概述4.5 结果演示 5 注意事项6 相关链接 1 前言 在这个智能硬件和物联网时代&#…

在Python中使用Kafka帮助我们处理数据

Kafka是一个分布式的流数据平台&#xff0c;它可以快速地处理大量的实时数据。Python是一种广泛使用的编程语言&#xff0c;它具有易学易用、高效、灵活等特点。在Python中使用Kafka可以帮助我们更好地处理大量的数据。本文将介绍如何在Python中使用Kafka简单案例。 一、安装K…

C到C++笔记记录

C到C笔记记录 输入(cin) and 输出(cout)bool内联(inline)重载缺省函数哑元引用(&)C动态内存分配笔记扩充&#xff1a; 输入(cin) and 输出(cout) #include<iostream>using namespace std;void main() {int i;//输入 cincin >> i;//输出 coutcout << i &…

浅谈云性能测试的关键要点

随着云计算的广泛应用&#xff0c;云性能测试成为确保云服务质量和性能的关键环节。云性能测试不仅涵盖了传统性能测试的方面&#xff0c;还需要考虑云环境的特殊性。以下是云性能测试的几个关键要点&#xff1a; 1. 模拟真实云环境 云环境具有虚拟化、弹性扩展等特点&#xff…