【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,一经查实,立即删除!

相关文章

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…

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;否则快指针先到达链表末尾…

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

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

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

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…

STM32 HAL库读取ID

在stm32f1xx_hal.c文件中由读取ID号的子函数&#xff0c;不同单片机的UID_BASE不同&#xff0c;本单片机用的是STM32F103CBT6,跳转之后可以看到地址为&#xff1a;0x1FFFF7E8 在程序中只需定义一个数组调用读取ID的函数即可 uint32_t UID[3]; while(1) { UID[0] HAL_GetUIDw0…

C盘清理和管理

本篇是C盘一些常用的管理方法&#xff0c;以及定期清理C盘的方法&#xff0c;大部分情况下都能避免C盘爆红。 C盘清理和管理 C盘存储管理查看存储情况清理存储存储感知清理临时文件清理不需要的 迁移存储 磁盘清理桌面存储管理应用存储管理浏览器微信 工具清理 C盘存储管理 查…

VUE3+ AntV Select 选择器:mode=“multiple“和mode=“tags“的区别是什么

文章目录 VUE3 AntV Select 选择器&#xff1a;mode"multiple"和mode"tags"的区别是什么一、解释二、对比演示 VUE3 AntV Select 选择器&#xff1a;mode"multiple"和mode"tags"的区别是什么 一、解释 “mode” 是一个参数&#xff…

SpringSecurity中文文档(Servlet Persisting Authentication)

Persisting Authentication 用户第一次请求受保护的资源时&#xff0c;系统会提示他们输入凭据。提示凭据的最常见方法之一是将用户重定向到登录页。对于请求受保护资源的未经身份验证的用户&#xff0c;总结的 HTTP 交换可能如下所示: Example 1. Unauthenticated User Requ…

VBA字典与数组第十六讲:行、列数不相同的数组间运算规律

《VBA数组与字典方案》教程&#xff08;10144533&#xff09;是我推出的第三套教程&#xff0c;目前已经是第二版修订了。这套教程定位于中级&#xff0c;字典是VBA的精华&#xff0c;我要求学员必学。7.1.3.9教程和手册掌握后&#xff0c;可以解决大多数工作中遇到的实际问题。…