【linux】网络基础(2)——udp协议

文章目录

  • 引言
  • udp协议的特点
  • udp的头部结构
  • UDP的工作原理
  • 简单的UDP网络程序
    • 套接字的认识
    • udp服务端代码
    • udp客户端代码
    • 服务端运行

引言

用户数据报协议(User Datagram Protocol, UDP)是一种无连接的传输层协议。它是因特网协议家族的一部分,定义在RFC 768中。UDP提供了一种简单且高效的数据传输方式,适用于需要快速传输、低延迟和不需要可靠传输保证的应用场景。

udp协议的特点

特点解释
无连接UDP是一种无连接协议。在传输数据之前,发送方和接收方不需要建立连接。每个数据报(Datagram)都是独立传输的,彼此之间没有关系。这种方式减少了传输前的握手时间,从而提高了传输速度。
不可靠传输UDP不保证数据的可靠传输。数据报在传输过程中可能会丢失、重复或乱序到达。应用程序需要自己处理这些情况,例如通过超时重传或错误检测和恢复机制。
数据报传输UDP以数据报的形式传输数据。每个数据报包含一个完整的消息,大小限制在65,535字节以内。由于每个数据报都是独立的,接收方需要根据数据报头的信息来判断数据的顺序和完整性。
轻量级UDP头部只有8个字节,包含源端口、目标端口、长度和校验和字段。相比之下,TCP头部有20个字节。较小的头部开销使得UDP在传输效率上更具优势。

udp的头部结构

在这里插入图片描述

报头名称功能
16位源端口号发送方的端口号
16位目的端口接收方的端口号
16位DUP长度UDP头部和数据部分的总长度
16位校验和用于错误检测,覆盖整个数据报,包括头部和数据部分(如果数据效验不匹配,则数据包会被丢弃,并且不会重传)

关于报头与数据的分离:因为报头的大小是固定的八个字节,在进行信息处理时,用UDP的长度减去固定长度八个字节,可以得出数据的具体大小

UDP的工作原理

数据报的生成与传输
1、生成数据报:应用程序将数据封装成数据报,包括UDP头部和数据部分。
2、发送数据报:UDP协议将数据报传递给网络层,网络层负责根据IP地址将数据报传输到目标主机。
3、接收数据报:目标主机的UDP协议接收数据报并将其传递给对应的应用程序。

简单的UDP网络程序

套接字的认识

// 创建 socket 文件描述符 (TCP/UDP, 客户端 + 服务器)
int socket(int domain, int type, int protocol);
// 绑定端口号 (TCP/UDP, 服务器) 
int bind(int socket, const struct sockaddr *address,socklen_t address_len);
// 开始监听socket (TCP, 服务器)
int listen(int socket, int backlog);
// 接收请求 (TCP, 服务器)
int accept(int socket, struct sockaddr* address,socklen_t* address_len);
// 建立连接 (TCP, 客户端)
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen)

udp服务端代码

#include "Inet_Addr.hpp"
#include <iostream>
#include <string>
#include <cerrno>
#include <cstring>
#include <unistd.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "Log.hpp"const static uint16_t defaultport = 8888;
const static int defaultfd = -1;
const static int defaultsize = 1024;class Udpserver
{
public:Udpserver(uint port = defaultport): _port(port),_sockfd(defaultfd){}void Init(){// 套接字创建_sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (_sockfd < 0){lg.LogMessage(Fatal, "socket errr, %d : %s \n", errno, strerror(errno));exit(1);}lg.LogMessage(Info, "socket success,sockfd: %d\n", _sockfd);// 套接字的设置struct sockaddr_in local;bzero(&local, sizeof(local)); // memsetlocal.sin_family = AF_INET;local.sin_port = htons(_port);local.sin_addr.s_addr = INADDR_ANY; // 0// 套接字绑定内核int n = bind(_sockfd, (struct sockaddr *)&local, sizeof(local));if (n != 0){lg.LogMessage(Fatal, "bind erro.......", errno, strerror(errno));exit(1);}lg.LogMessage(Info, "bind success");}void Start(){char buffer[defaultsize];for (;;){struct sockaddr_in peer;socklen_t len = sizeof(peer);int n = recvfrom(_sockfd, &buffer, sizeof(buffer) - 1, 0, (struct sockaddr *)&peer, &len);if (n > 0){InetAddr addr(peer);buffer[n] = 0;std::cout << "[" << addr.PrintDebug() << "]# " << buffer << std::endl;sendto(_sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)&peer, len);}}}~Udpserver(){}
private:uint16_t _port;int _sockfd;
};

udp客户端代码

#include <iostream>
#include <cerrno>
#include <cstring>
#include <string>
#include <fstream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
using namespace std;
void Usage()
{std::cout << "客户端连接服务参数错误" << std::endl;
}
int main(int argc,char* argv[])
{if (argc != 3){Usage();return 1;}std::string server_ip = argv[1];uint16_t server_port = std::stoi(argv[2]);int sock = socket(AF_INET, SOCK_DGRAM, 0);if(sock < 0){std::cout << "sock erro..." << std::endl;exit(1);}elsestd::cout << "sock succcess..." << std::endl;struct sockaddr_in server;memset(&server,0,sizeof(server));server.sin_port = htons(server_port);server.sin_addr.s_addr = inet_addr(server_ip.c_str());;server.sin_family = AF_INET;while(true){std::string inbuffer;std::cout<<"please enter# " << std::endl;std::getline(std::cin,inbuffer);ssize_t n = sendto(sock,inbuffer.c_str(),sizeof(inbuffer)-1,0,(struct sockaddr*)&server,sizeof(server));if(n > 0){char buffer[1024];struct sockaddr_in temp;socklen_t len = sizeof(temp);ssize_t m = recvfrom(sock,buffer,sizeof(buffer)-1,0,(struct sockaddr*)&temp,&len);if(m > 0){buffer[m] = 0;cout << "server say#: " << buffer << endl;}else break;}elsebreak;}close(sock);return 0;
}

服务端运行

#include "UdpServer.hpp"
#include <memory>
#include "Inet_Addr.hpp"
void Usage()
{std::cout << "服务器启动参数设置错误" << std::endl;
}
int main(int argc, char *argv[])
{if((argc != 2)){Usage();return 0;}uint16_t port = std::stoi(argv[1]);std::unique_ptr<Udpserver> usv = std::make_unique<Udpserver>(port);usv->Init();usv->Start();
}

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

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

相关文章

表单长时间无响应,页面失效提示

先贴代码&#xff0c;有时间在解释 <template><div :class"$style.root"><div>主页面</div><el-input v-model"txt" input"onChange" /></div> </template> <script> const TIME 10; //时间&…

C语言的数据结构:图的基本概念

前言 之前学过了其它的数据结构&#xff0c;如&#xff1a; 集合 \color{#5ecffd}集合 集合 —— 数据元素属于一个集合。 线型结构 \color{#5ecffd}线型结构 线型结构 —— 一个对一个&#xff0c;如线性表、栈、队列&#xff0c;每一个节点和其它节点之间的关系 一个对一个…

超酷的打字机效果?分享 1 段优质 CSS 代码片段!

大家好&#xff0c;我是大澈&#xff01; 本文约 900 字&#xff0c;整篇阅读约需 1 分钟。 每日分享一段优质代码片段。 今天分享一段优质 CSS 代码片段&#xff0c;实现打字机般的效果或其他类似的离散动画效果。 老规矩&#xff0c;先阅读代码片段并思考&#xff0c;再看代…

Python入门 2024/7/2

目录 格式化的精度控制 字符串格式化 对表达式进行格式化 小练习&#xff08;股票计算小程序&#xff09; 数据输入 布尔类型和比较运算符 if语句 小练习&#xff08;成人判断&#xff09; if-else语句 if-elif-else语句 练习&#xff1a;猜猜心里数字 嵌套语句 猜…

Pytest+Allure+Yaml+PyMsql+Jenkins+Gitlab接口自动化(四)Jenkins配置

一、背景 Jenkins&#xff08;本地宿主机搭建&#xff09; 拉取GitLab(服务器)代码到在Jenkins工作空间本地运行并生成Allure测试报告 二、框架改动点 框架主运行程序需要先注释掉运行代码&#xff08;可不改&#xff0c;如果运行报allure找不到就直接注释掉&#xff09; …

offer7.重建二叉树

根据二叉树的前序遍历和中序遍历重建二叉树 问题描述&#xff1a;输入某二叉树的前序遍历和中序遍历的结果&#xff0c;请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如&#xff0c;输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3…

二叉树之遍历OJ(含迭代)

目录 1.递归实现 前言 &#xff08;1&#xff09;前序遍历 &#xff08;2&#xff09;中序遍历 &#xff08;3&#xff09;后序遍历 2.迭代实现 前言 &#xff08;1&#xff09;前序遍历 方法一 方法二 &#xff08;2&#xff09;中序遍历 方法一 方法二 &#x…

2023年“科创中国”系列榜单发布

在7月2日召开的第二十六届中国科协年会上&#xff0c;中国科协正式发布2023年“科创中国”系列榜单。榜单经初评、终评&#xff0c;遴选出先导技术榜150项、新锐企业榜50项、融通创新组织榜10项、技术经理人先锋榜20项&#xff0c;共计230项入榜项目。 作为“科创中国”建设的…

BIOS设置与系统分区

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 目录 一BIOS 1破解密码的前提 2B…

《植物大战僵尸融合版》1.0预览版下载以及安装教程

游戏介绍 《植物大战僵尸融合版》是一款基于经典游戏《植物大战僵尸》的创新改版&#xff0c;由B站UP主蓝飘飘fly开发。这款游戏的特色在于引入了植物融合系统&#xff0c;允许玩家将两种不同的植物合体&#xff0c;创造出具有新特性的植物&#xff0c;从而带来全新的策略对战…

Canvas:掌握贝塞尔曲线与封装路径

想象一下&#xff0c;用几行代码就能创造出如此逼真的图像和动画&#xff0c;仿佛将艺术与科技完美融合&#xff0c;前端开发的Canvas技术正是这个数字化时代中最具魔力的一环&#xff0c;它不仅仅是网页的一部分&#xff0c;更是一个无限创意的画布&#xff0c;一个让你的想象…

文件夹加密软件推荐,这款软件满足各种加密需求

文件夹加密是保护电脑数据安全的重要方式&#xff0c;而在加密文件夹时&#xff0c;我们需要选择专业的文件夹加密软件。下面小编就为大家推荐一款优秀的文件夹加密软件&#xff0c;满足你的各种文件夹加密需求。 文件夹加密超级大师 由于文件夹储存的数据不同&#xff0c;比如…

MCU 是什么?一文了解MCU 产业

MCU&#xff08;Microcontroller Unit&#xff09;&#xff0c;中文名为“微控制器单元”、“单片微型计算机”。MCU 将中央处理器&#xff08;CPU&#xff09;、内存&#xff08;RAM&#xff09;、输入 / 输出界面&#xff08;I/O&#xff09;等等一大堆东西&#xff0c;全部整…

数据结构——带环链表、循环队列问题

1.带环链表问题 1.1给定一个链表判断其是否带环 解决思路&#xff1a;利用快慢指针法&#xff0c;快指针一次走两步慢指针一次走一步&#xff0c;从链表起始位置遍历链表&#xff0c;如果链表带环&#xff0c;则快慢指针一定会在环中相遇&#xff0c;否则快指针先到达链表末尾…

54、Flink 测试工具测试 Flink 作业详解

测试 Flink 作业 a&#xff09;JUnit 规则 MiniClusterWithClientResource Apache Flink 提供了一个名为 MiniClusterWithClientResource 的 Junit 规则&#xff0c;用于针对本地嵌入式小型集群测试完整的作业。 叫做 MiniClusterWithClientResource. 要使用 MiniClusterWit…

Kafka-服务端-副本同步-源码流程

杂 在0.9.0.0之前&#xff0c;Kafka提供了replica lag.max.messages 来控制follower副本最多落后leader副本的消息数量&#xff0c;follower 相对于leader 落后当超过这个数量的时候就判定该follower是失效的&#xff0c;就会踢出ISR&#xff0c;这里的指的是具体的LEO值。 对…

墨烯的C语言技术栈-C语言基础-001

(最近报名了9月的计算机二级 得好好重温一下C语言 祝我计算机二级必过!) 学习视频为B站的哔哩大学计算机学院 参考书籍为C语言程序设计第五版(张磊主编) 一.什么是C语言C语言是一门通用计算机编程语言 广泛应用底层开发 C语言的设计目标是提供一种能以简易的方式编译 处理低级…

面试历程--工行外包,岗位高级测试工程师

岗位来源&#xff1a;朋友内推 面试形式&#xff1a;线上会议 面试官&#xff1a;开始三人&#xff0c;后续两人 面试历程&#xff1a; 1.自我介绍&#xff1a;老样子&#xff0c;没有突出重点 2.问题&#xff1a; 2.1 自动化测试框架用的什么&#xff1f; 回答springbo…

软考高级之系统分析师及系统架构设计师备考过程记录

0x00 前言 考了两次系分&#xff0c;一次架构&#xff0c;今年系分终于上岸。 在此记录备考过程和一些体会 先说我自己的情况&#xff0c;我本硕都是计算机科班出身&#xff0c;本科的时候搞Java后端开发&#xff0c;硕士搞python和深度学习&#xff0c;但工作之后就基本没碰过…

洞鉴-产品部署及其功能

网络策略&#xff1a;安装&#xff1a; 资源准备 ⼀、系统安装包 https://chaitin-release.oss-cnbeijing.aliyuncs.com/release%2Ff%2F66600aac66bcea13c086319c?Expires1719310707 &OSSAccessKeyIdLTAI5tBpSz7iLYLH51NrVx22&SignaturesOpuVYuKpm9ZBoEzfwiRlJ fLrhQ…