【网络编程】TFTP简单文件传输协议、udp广播及多播
目录一、tftp概述二、TFTP的通信过程三、TFTP的协议报文分析四、抓包工具wireshark1、IP过滤2、协议过滤3、端口过滤4、mac地址过滤5、逻辑与与逻辑或五、tftp示例六、UDP广播1、广播的概述2、UDP广播的特点3、UDP广播地址4、广播与单播的对比​编辑 5、广播编程6、udp多播组播1、多播的概述2、多播地址3、多播地址结构体一、tftp概述tftp简单文件传输协议、基于UDP协议。数据传输模式octet二进制模式 netascii文本模式二、TFTP的通信过程TFTP通信过程总结无选项服务器在69号端口等待客户端的请求。服务器若批准此请求,则使用临时端口与客户端进行通信。每个数据包的编号都有变化从1开始。每个数据包都要得到ACK的确认如果出现超时,则需要重新发送最后的包数据或 ACK。数据的长度以512Byte传输 6、小于512Byte的数据意味着传输结束 。三、TFTP的协议报文分析六种报文ERROR(5)差错码信息差错码1File not found.2Access violation3Disk full or allocation exceeded4illegal TFTP operation5Unknown tlansfer ID6File already exists7No such user8Unsupported option(s) requestedTFTP带选项的读写报文通信过程tsize选项:当读操作时tsize选项的参数必须为“0”服务器会返回待读取的文件的大小当写操作时tsize选项参数应为待写入文件的大小服务器会回显该选项blksize选项:修改传输文件时使用的数据块的大小范围865464timeout选项:修改默认的数据传输超时时间单位秒四、抓包工具wireshark过滤规则1、IP过滤ip.src192.168.44.130只显示源IP为192.168.44.130的数据报文ip.dst192.168.44.130只显示目的IP为192.168.44.130的数据报文ip.addr192.168.44.130只显示示源IP或目的IP为192.168.44.130的数据报文2、协议过滤tcp udp arp tftp3、端口过滤udp.srcport8000只显示源端口为8000的udp报文udp.dstport8000只显示目的端口为8000的udp报文udp.port8000只显示目的或源端口为8000的udp报文tcp.srcport8000只显示源端口为8000的tcp报文tcp.dstport8000只显示目的端口为8000的tcp报文tcp.port8000只显示目的或源端口为8000的tcp报文4、mac地址过滤eth.srcaa:bb:cc:dd:ee:ff只显示源mac为aa:bb:cc:dd:ee:ff的数据报文eth.dstaa:bb:cc:dd:ee:ff只显示目的mac为aa:bb:cc:dd:ee:ff的数据报文 eth.addraa:bb:cc:dd:ee:ff只显示源mac或目的mac为aa:bb:cc:dd:ee:ff的数据报文5、逻辑与与逻辑或and 逻辑与 同时满足or || 逻辑或 只要有一个满足就行五、tftp示例编写TFTP客户端并不带选项 从服务器下载文件流程sockfd 创建UDP套接字构建读请求报文、并发送到服务器的69号端口fdopen以写的方式打开本地文件while(1){unsigned char buf[516];int len recvfrom(sockfd,buf,sizeof(buf),0, dst_addr,sizeof(ds_addr));write(fd,buf4,len‐4);if(len 516)break;}close(fd);close(sockfd);构建下载a.txt的报文unsigned char read_cmd[128];int s_len sprintf(read_cmd,%c%c%s%c%s%c,0,1,a.txt, 0,octet, 0);sendto(sockfd,read_cmd,s_len,0,dst_addr‐‐69 )tftp客户端下载文件#include stdio.h #include stdlib.h #include unistd.h #include fcntl.h #include string.h #include sys/socket.h #include netinet/in.h #include arpa/inet.h #include signal.h static int sockfd; void sig_dispose(int sig) { if (SIGINT sig) { close(sockfd); puts(\nclose!); exit(0); } } /*********************************************************************** * 函数名称 int main(int argc, char *argv[]) 函数功能 tftp客户端程序可以从tftp服务器下载程序 ************************************************************************/ int main(int argc, char *argv[]) { unsigned short p_num 0; unsigned char cmd 0; char cmd_buf[512] ; char recv_buf[516] ; struct sockaddr_in client_addr; socklen_t cliaddr_len sizeof(client_addr); signal(SIGINT, sig_dispose); if (argc 3) { // 如果参数个数小于3,则认为输入命令错误 printf(cmd example:./tftpc 192.168.8.8 hello.txt\n); return 0; } sockfd socket(AF_INET, SOCK_DGRAM, 0); if (sockfd 0) { perror(socket error); exit(-1); } struct sockaddr_in dest_addr; bzero(dest_addr, sizeof(dest_addr)); dest_addr.sin_family AF_INET; dest_addr.sin_port htons(69); inet_pton(AF_INET, argv[1], dest_addr.sin_addr.s_addr); // 构造下载请求,argv[2]为文件名 int len sprintf(cmd_buf, %c%c%s%c%s%c, 0, 1, argv[2], 0, octet, 0); sendto(sockfd, cmd_buf, len, 0, (struct sockaddr *)dest_addr, sizeof(dest_addr)); int fd open(argv[2], O_WRONLY | O_CREAT, 0666); if (fd 0) { perror(open error); close(sockfd); exit(-1); } do { // 接收服务器发送的内容 len recvfrom(sockfd, recv_buf, sizeof(recv_buf), 0, (struct sockaddr *)client_addr, cliaddr_len); cmd recv_buf[1]; if (cmd 3) // 是否为数据包 { // 接收的包编号是否为上次包编号1 if ((unsigned short)(p_num 1) ntohs(*(unsigned short *)(recv_buf 2))) { write(fd, recv_buf 4, len - 4); p_num ntohs(*(unsigned short *)(recv_buf 2)); printf(recv:%d\n, p_num); // 十进制方式打印包编号 } recv_buf[1] 4; sendto(sockfd, recv_buf, 4, 0, (struct sockaddr *)client_addr, sizeof(client_addr)); } else if (cmd 5) // 是否为错误应答 { close(sockfd); close(fd); unlink(argv[2]); // 删除文件 printf(error:%s\n, recv_buf 4); exit(-1); } } while (len 516); // 如果收到的数据小于516则认为出错 close(fd); return 0; }六、UDP广播1、广播的概述广播由一台主机向该主机所在子网内的所有主机发送数据的方式广播只能用UDP或原始IP实现不能用TCP。以下几个协议都用到广播地址解析协议ARP动态主机配置协议DHCP网络时间协议NTP2、UDP广播的特点处于同一子网的所有主机都必须处理数据UDP数据包会沿协议栈向上一直到UDP层运行音视频等较高速率工作的应用会带来很大的负担局限于局域网内使用3、UDP广播地址定向广播地址主机ID全11、例对于192.168.44.0/24其定向广播地址为192.168.44.2552、通常路由器不转发该广播受限广播地址255.255.255.255路由器从不转发该广播4、广播与单播的对比单播广播5、广播编程socket函数创建的套接字 一般不支持广播。setsockopt函数 可以让 套接字 支持广播。int setsockopt(int sockfd, int level,int optname,const void *optval, socklen_t optlen);参数说明成功执行返回0否则返回-1示例#include stdio.h #include stdlib.h #include unistd.h #include fcntl.h #include string.h #include sys/socket.h #include netinet/in.h #include arpa/inet.h int main(int argc, char const *argv[]) { // 创建一个udp套接字 int sockfd socket(AF_INET, SOCK_DGRAM, 0); // 使用setsockopt函数设置sockfd支持广播 int yes 1; setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, yes, sizeof(int)); // 发送广播数据 struct sockaddr_in dst_addr; bzero(dst_addr, sizeof(dst_addr)); // memset(dst_addr,0,sizeof(dst_addr)); dst_addr.sin_family AF_INET; dst_addr.sin_port htons(8000); inet_pton(AF_INET, 192.168.131.255, dst_addr.sin_addr.s_addr); sendto(sockfd, broadcast msg, strlen(broadcast msg), 0, (struct sockaddr *)dst_addr, sizeof(dst_addr)); close(sockfd); return 0; }6、udp多播组播1、多播的概述多播数据的收发仅仅在同一分组中进行多播的特点多播地址标示一组接口多播可以用于广域网使用在IPv4中多播是可选的2、多播地址多播IP地址范围224.0.0.1 ~ 239.255.255.254多播mac地址映射 前5位固定后23位映射通信过程基于mac地址的不完备硬件过滤基于IP地址的完备软件过滤3、多播地址结构体setsockopt函数支持多播int setsockopt(int sockfd, int level,int optname, const void *optval, socklen_t optlen);参数说明#include stdio.h #include stdlib.h #include unistd.h #include fcntl.h #include string.h #include sys/socket.h #include netinet/in.h #include arpa/inet.h int main(int argc, char const *argv[]) { // 创建一个udp套接字 int sockfd socket(AF_INET, SOCK_DGRAM, 0); // bind绑定固定端口 struct sockaddr_in my_addr; bzero(my_addr, sizeof(my_addr)); my_addr.sin_family AF_INET; my_addr.sin_port htons(8000); my_addr.sin_addr.s_addr htonl(INADDR_ANY); bind(sockfd, (struct sockaddr *)my_addr, sizeof(my_addr)); // 使用setsockopt函数加入224.0.0.2多播组中 struct ip_mreq mreq; // inet_pton(AF_INET,224.0.0.2,mreq.imr_multiaddr.s_addr); mreq.imr_multiaddr.s_addr inet_addr(224.0.0.3); // 多播组IP mreq.imr_interface.s_addr inet_addr(192.168.44.131); // 加入多播组的IP setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, mreq, sizeof(struct ip_mreq)); // 接收多播组的消息 while (1) { unsigned char buf[1500] ; recvfrom(sockfd, buf, sizeof(buf), 0, NULL, NULL); printf(%s\n, buf); } close(sockfd); return 0; }

相关新闻

动态规划(背包、组合之和...)

动态规划(背包、组合之和...)

1背包问题 假设有一个背包,体积是 V,另外有 n 个物品,物品的体积分别是 v1, v2, ... vn,每个物品的价值是 w1, w2, ... wn。求怎么将物品放到背包里,才能使背包中物品的价值最大 ? 背包问题是一个典型的动…

2026/7/22 2:20:28 阅读更多 →
Unity 2021.3.6配置Pico SDK 230实现手势识别完整指南

Unity 2021.3.6配置Pico SDK 230实现手势识别完整指南

1. 项目概述:为什么Pico 4手势识别值得投入?如果你正在用Unity为Pico 4开发应用,并且对手势识别这个功能点产生了兴趣,那这篇文章就是为你准备的。我最近刚完成了一个基于Pico 4的手势交互项目,从环境搭建到功能上线&a…

2026/7/22 1:44:23 阅读更多 →
Hyperf框架实战:构建高性能PHP微服务应用

Hyperf框架实战:构建高性能PHP微服务应用

1. Hyperf框架入门:从零构建高性能PHP应用第一次接触Hyperf时,我被它的性能数据震撼到了——单机百万级QPS的处理能力,这完全颠覆了我对PHP框架的认知。作为一个长期使用Laravel的开发者,Hyperf带来的协程和依赖注入设计让我看到了…

2026/7/23 22:26:37 阅读更多 →

最新新闻

市面上知名的导电胶内存颗粒测试治具公司芯片检测利器

市面上知名的导电胶内存颗粒测试治具公司芯片检测利器

在芯片检测领域,导电胶内存颗粒测试治具起着至关重要的作用,它直接影响着芯片测试的准确性、效率和成本。今天就来为大家介绍一些市面上知名的相关公司,重点聚焦于深圳市谷易电子有限公司。谷易电子:专而精的芯片检测方案提供者品…

2026/7/25 3:19:41 阅读更多 →
企业多模态数据融合技术架构与实践指南

企业多模态数据融合技术架构与实践指南

1. 项目概述在数字化转型浪潮中,企业数据资产的价值挖掘正面临全新挑战。作为从业十余年的AI架构师,我见证了从单一模态分析到多模态融合的技术演进。当前企业数据处理的痛点在于:分散在各业务系统的文本、图像、时序数据如同信息孤岛&#x…

2026/7/25 3:19:41 阅读更多 →
AI Agent技术在水质监测中的智能预警应用

AI Agent技术在水质监测中的智能预警应用

1. 项目背景与核心价值水质安全监测领域正面临传统人工采样检测周期长、突发污染响应滞后等行业痛点。去年参与某流域水站智能化改造时,我们发现传统SCADA系统对藻类暴发等复杂水质异常的平均预警延迟达到8-12小时。而引入AI Agent技术后,通过实时分析多…

2026/7/25 3:19:41 阅读更多 →
跟踪 Taotoken API 调用的稳定性与路由容灾表现

跟踪 Taotoken API 调用的稳定性与路由容灾表现

跟踪 Taotoken API 调用的稳定性与路由容灾表现 对于依赖大模型 API 进行开发的团队而言,服务的稳定性和高可用性是保障业务连续性的关键。Taotoken 作为一个聚合分发平台,其核心价值之一在于通过统一入口连接多家模型厂商,并在后端提供路由…

2026/7/25 3:19:41 阅读更多 →
AI 走向物理世界与超级智能体:未来 1 3 5 10 年趋势与企业 AI Agent 中台战略研究

AI 走向物理世界与超级智能体:未来 1 3 5 10 年趋势与企业 AI Agent 中台战略研究

AI 走向物理世界与超级智能体:未来 1–3 年 / 5 年 / 10 年趋势与企业 AI Agent 中台战略研究 一份面向战略决策者与架构师的研究论文。聚焦三条主线:AI 物理世界大模型、可自主学习进化的超级智能体 Agent 架构、企业 AI 操作系统与 Agent 中台&#xf…

2026/7/25 3:19:41 阅读更多 →
2026大模型技术全景:从架构演进到行业应用

2026大模型技术全景:从架构演进到行业应用

1. 大模型技术入门:从零开始的认知框架作为从业五年的AI工程师,我经常被问到一个问题:"现在入局大模型还来得及吗?"答案是肯定的。2026年的大模型技术发展呈现出明显的垂直化趋势,这意味着在不同领域都存在弯…

2026/7/25 3:18:41 阅读更多 →

日新闻

突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,该脚本就是为了解决您的…

2026/7/25 0:00:35 阅读更多 →
C++ string类模拟实现:从深拷贝到内存管理的完整指南

C++ string类模拟实现:从深拷贝到内存管理的完整指南

1. 项目概述:为什么我们要“手撕”string类?在C的学习道路上,尤其是从C语言过渡到C的“初阶”阶段,string类绝对是一个绕不开的核心。标准库里的std::string用起来太方便了,、find、substr,几个操作符和函数…

2026/7/25 0:00:35 阅读更多 →
三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

1. 先搞清楚“三角洲寻宝鼠”到底是什么工具从名称来看,“三角洲寻宝鼠”更像是一个资源查找或文件检索类工具,而不是游戏或娱乐软件。这类工具的核心价值在于帮助用户快速定位特定资源,比如文档、图片、压缩包或特定格式的文件。如果你经常需…

2026/7/25 0:00:35 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/24 3:59:20 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 1:23:39 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/24 18:52:18 阅读更多 →

月新闻