网络编程(三)UDP TFTP协议

文章目录

  • 一、 UDP
    • (一)概述
    • (二)流程
  • 二、收发函数
    • (一)recvfrom
    • (二)sendto
  • 三、实现一个简单的udp服务端和客户端
  • 四、实现tftp客户端协议

一、 UDP

(一)概述

UDP(User Datagram Protocol)用户数据报协议:
是不可靠的无连接的协议。在数据发送前,因为不需要进行连接,所以可以进行高效率的数据传输。

  • 注:
    默认支持并发
    不存在“粘包”的现象

(二)流程

在这里插入图片描述
服务器流程
创建套接字–socket()
填充服务器网络信息结构体
将套接字与服务器网络信息结构体绑定–bind()
收发数据–sendto() recvfrom()
关闭套接字–close()

客户端流程
创建套接字–socket()
填充服务器网络信息结构体
收发数据–sendto() recvfrom()
关闭套接字–close()

二、收发函数

(一)recvfrom

#include <sys/types.h>
#include <sys/socket.h>
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
功能:在套接字上接收一条消息
参数:前 4 个参数用法和 recv 函数的4个参数用法一模一样后 2 个参数用法和 accept 函数的后两个参数用法一样 用来 保存发送方的网络信息结构体的
返回值:成功 实际接收的字节数失败 -1 重置错误码recvfrom函数用在UDP中是不会返回0

(二)sendto

#include <sys/types.h>
#include <sys/socket.h>
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
功能:向套接字上发送一条消息
参数:前 4 个参数用法和 send 函数的4个参数用法一模一样后 2 个参数用法和 connect 函数的后两个参数用法一样 用来 指定消息发给谁的
返回值:成功 实际发送的字节数失败 -1 重置错误码

三、实现一个简单的udp服务端和客户端

四、实现tftp客户端协议

TFTP概述
TFTP:简单文件传送协议
最初用于引导无盘系统,被设计用来传输小文件

特点:
基于UDP协议实现
不进行用户有效性认证

数据传输模式:
octet:二进制模式
netascii:文本模式
mail:已经不再支持

需求分析
1、服务器在69号端口等待客户端的请求
2、服务器若批准此请求,则使用临时端口与客户端进行通信
3、每个数据包的编号都有变化(从1开始)
4、每个数据包都要得到ACK的确认如果出现超时,则需要重新发送最后的包(数据或ACK)
5、数据的长度以512Byte传输
6、小于512Byte的数据意味着传输结束

注意点
1.tftp服务器仅在69号端口接收客户端的请求,批准请求后,使用临时端口与客户端进行通信
2.每个数据包都要得到ACK的确认

代码实现

#include <my_head.h>int main(int argc, char const *argv[])
{if(2 != argc){printf("Usage: %s IPv4\n",argv[0]);exit(-1);}//创建套接字int socketfd = 0;if(-1 == (socketfd = socket(AF_INET,SOCK_DGRAM,0))){ERR_LOG("socket error");}//填充结构体struct sockaddr_in clentaddr;clentaddr.sin_family=AF_INET;clentaddr.sin_port=htons(69);clentaddr.sin_addr.s_addr=inet_addr(argv[1]); //字符串转四字节网络序整型socklen_t clentlen = sizeof(clentaddr);//发送请求char buff[600]={0};char filename[20]={0};printf("请输入想要下载的文件:");scanf("%s",filename);int dest_fd = open(filename,O_WRONLY|O_CREAT|O_TRUNC,0664);//组装请求数据包int nbytes = sprintf(buff,"%c%c%s%c%s%c",0,1,filename,0,"octet",0);if(-1 == sendto(socketfd,buff,nbytes,0,(struct sockaddr *)&clentaddr,clentlen)){ERR_LOG("sendto error");}unsigned short option=0;unsigned short node =0;char data[512]={0};char ack[4];while(1){//接收服务器数据memset(buff, 0, sizeof(buff));memset(data, 0, sizeof(data));nbytes = recvfrom(socketfd,buff,sizeof(buff),0,(struct sockaddr *)&clentaddr,&clentlen);//解析数据(网络字节序)option = *(unsigned short *)buff;//操作码node = *(unsigned short *)(buff+2);//块编号strncpy(data,buff+4,nbytes-4);if(5 == ntohs(option)){//说明出错了printf("差错码:%d; 差错信息:%s\n",ntohs(node),buff);}else if(3 == ntohs(option)){printf("已接收到数据\n");//说明发送过来数据了,组装应答数据包memset(ack,0,4);ack[0]=0;ack[1]=4;*(unsigned short *)(ack+2)=node;//发送ACKif(-1 == sendto(socketfd,ack,4,0,(struct sockaddr *)&clentaddr,clentlen)){ERR_LOG("sendto error");}//写入文件中if(-1 == write(dest_fd,data,nbytes-4)){ERR_LOG("write error");}}if(nbytes < 516)//数据包内容不足512字节,说明文件拷贝完毕break;}printf("Download over\n");close(dest_fd);close(socketfd);return 0;
}

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

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

相关文章

shell条件测试和if语句

“C:\Users\Jessica\Desktop\6.12.assets\image-20240612094159578.png”# shell条件测试和if语句 一、条件测试 1、$? 返回码 判断命令或者脚本是否执行成功&#xff08;最近的一条&#xff09; 0 true 为真就是成功 成立 非0 false 失败或者异常 2、test命令 可以进行…

Docker 镜像源更换

实现 替换docker 镜像源 前提要求 安装 docker docker-compose 参考创建一键更换docker国内镜像源 Docker 镜像代理DaoCloud 镜像站百度云 https://mirror.baidubce.com南京大学镜像站

【Qt 学习笔记】Qt窗口 | 对话框 | 创建自定义对话框

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt窗口 | 对话框 | 创建自定义对话框 文章编号&#xff1a;Qt 学习笔记…

opencv 通过滑动条调整阈值处理、边缘检测、轮廓检测、模糊、色调调整和对比度增强参数 并实时预览效果

使用PySimpleGUI库创建了一个图形用户界面(GUI),用于实时处理来自OpenCV摄像头的图像。它允许用户应用不同的图像处理效果,如阈值处理、边缘检测、轮廓检测、模糊、色调调整和对比度增强。用户可以通过滑动条调整相关参数。 完整代码在文章最后,可以运行已经测试; 代码的…

怎么修改Visual Studio Code中现在github账号

git config --global user.name “你的用户名” git config --global user.email “你的邮箱” git config --global --list git push -u origin your_branch_name git remote add origin

又一个对标Sora的AI视频工具,Dream Machine,开始免费试用

新的AI视频工具又又来了-Dream Machine&#xff0c;开始免费试用。 地址&#xff1a;https://lumalabs.ai/dream-machine 该工具需要科学上网 先看一下官网的宣传视频 luma AI 发布 Dream Machine 我生成了几个视频&#xff0c;效果还可以 生成视频很简单 只需要输入描述就可…

KUKA机器人KRC5控制柜面板LED显示

对于KUKA机器人新系列控制柜KRC5控制柜来说&#xff0c;其控制柜面板LED布局如下图&#xff1a; 其中①②③④分别为&#xff1a; 1、机器人控制柜处于不同状态时&#xff0c;LED显示如下&#xff1a; 2、机器人控制柜正在运行时&#xff1a; 3、机器人控制柜运行时出现的故障…

编写函数isprime(int a),用来判断自变量a是否为素数,若是素数,函数返回整数1,否则返回0

int main() {int isprime(int x);int x;printf("请输入一个数\n");scanf("%d", &x);if (isprime(x)){printf("%d是素数\n",x);}else{printf("%d不是素数\n",x);} } int isprime(int a) {int i;for (i 2; i < a / 2; i){if (a%…

Linux_应用篇(17) FrameBuffer 应用编程

本章学习 Linux 下的 Framebuffer 应用编程&#xff0c; 通过对本章内容的学习&#xff0c; 大家将会了解到 Framebuffer 设备究竟是什么&#xff1f;以及如何编写应用程序来操控 FrameBuffer 设备。 本章将会讨论如下主题。 ⚫ 什么是 Framebuffer 设备&#xff1f; ⚫ LCD 显…

MySQL系列-语法说明以及基本操作(二)

1、MySQL数据表的约束 1.1、MySQL主键 “主键&#xff08;PRIMARY KEY&#xff09;”的完整称呼是“主键约束”。 MySQL 主键约束是一个列或者列的组合&#xff0c;其值能唯一地标识表中的每一行。这样的一列或多列称为表的主键&#xff0c;通过它可以强制表的实体完整性。 …

辽宁普通测径仪升级智能测径仪后都有哪些改进?

关键字: 普通测径仪, 智能测径仪, 测径仪升级, 测径仪特点, 智能测径仪优势, 目前多数厂家测径仪的数据处理方式是单片机计算出最终结果&#xff0c;然后传输到工控机后期处理。这样的电路系统对轧钢现场的高温、高粉尘和强电磁干扰的环境适应性很差&#xff0c;使得同一厂家、…

算法:模拟题目练习

目录 题目一&#xff1a;替换所有的问号 题目二&#xff1a;提莫攻击 题目三&#xff1a;N字形变换 题目四&#xff1a;外观数列 题目五&#xff1a;数青蛙 首先先解释一下模拟算法是什么&#xff0c;其实模拟算法就是题目让我们干什么我们就干什么&#xff0c;思路比较简…

如何对stm32查看IO功能。

有些同学对于别人的开发板的资源&#xff0c;或者IO口&#xff0c;或者串口等资源不知道怎么分配。 方法1、看硬石、野火、正点原子的开发板&#xff0c;看下他们的例子&#xff0c;那个资源用什么。自己多看几个原理图&#xff0c;多看几个视频&#xff0c;做一下笔记。以后依…

【iOS】JSONModel源码阅读笔记

文章目录 前言一、JSONModel使用二、JSONModel其他方法转换属性名称 三、源码分析- (instancetype)initWithDictionary:(NSDictionary*)dict error:(NSError **)err[self init]__setup____inspectProperties - (BOOL)__doesDictionary:(NSDictionary*)dict matchModelWithKeyMa…

ubuntu软件安装

目录 更新Ubuntu软件下载地址 1. 寻找国内镜像源 2. 备份Ubuntu默认的源地址 3. 更新源服务器列表 4. 更新源 更新Ubuntu软件下载地址 1. 寻找国内镜像源 所谓的镜像源&#xff1a;可以理解为提供下载软件的地⽅&#xff0c;⽐如 Android ⼿机上可以下载软件的 91 ⼿机助…

【快速上手】Win11家庭版升级专业版的3种方法!

在Win11电脑操作中&#xff0c;用户使用的是家庭版系统&#xff0c;现在用户想把家庭版升级为专业版&#xff0c;但不知道具体要怎么操作才能完成版本的升级操作&#xff1f;接下来小编介绍三种简单快速的方法&#xff0c;帮助大家轻松将Win11电脑系统升级为专业版本。 方法 1&…

WPF/C#:异常处理

什么是异常&#xff1f; 在C#中&#xff0c;异常是在程序执行过程中发生的特殊情况&#xff0c;例如尝试除以零、访问不存在的文件、网络连接中断等。这些情况会中断程序的正常流程。 当C#程序中发生这种特殊情况时&#xff0c;会创建一个异常对象并将其抛出。这个异常对象包…

【纯血鸿蒙】——响应式布局如何实现?

前面介绍了自适应布局&#xff0c;但是将窗口尺寸变化较大时&#xff0c;仅仅依靠自适应布局可能出现图片异常放大或页面内容稀疏、留白过多等问题。此时就需要借助响应式布局能力调整页面结构。 响应式布局 响应式布局是指页面内的元素可以根据特定的特征&#xff08;如窗口…

js实现一个数据结构——栈

栈的概念就不再赘述&#xff0c;无可厚非的先进后出&#xff0c;而JS又是高级语言&#xff0c;数组中的方法十分丰富&#xff0c;已经自带了push pop方法进行入栈出栈的操作。 1.基本实现 class Stack {constructor() {this.items [];}// 入栈push(item) {this.items.push(i…

Python学习笔记7:入门知识(七)

前言 之前说过我更换了新的学习路线&#xff0c;现在是根据官方文档和书籍Python crash course来进行学习的&#xff0c;在目前的学习中&#xff0c;对于之前的知识有一些遗漏&#xff0c;这里进行补充。 学习资料有两个&#xff0c;书籍中文版PDF&#xff0c;关注我私信发送…