Linux UDP编程流程
文章目录
- UDP编程流程
- UDP协议无连接的特点
- UDP协议数据报的特点
UDP编程流程
UDP 提供的是无连接、不可靠的、数据报服务。服务器端和客户端没有什么本质上的区别。编程流程如下:

socket()用来创建套接字,使用 udp 协议时,选择数据报服务 SOCK_DGRAM。sendto()用来发送数据,由于 UDP 是无连接的,每次发送数据都需要指定对端的地址(IP 和端口)。recvfrom()接收数据,每次都需要传给该方法一个地址结构来存放发送端的地址。recvfrom()可以接收所有客户端发送给当前应用程序的数据,并不是只能接收某一个客户端的数据。
服务器端代码ser.c如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>int main()
{ //1.创建套接字int sockfd=socket(AF_INET,SOCK_DGRAM,0);if(sockfd==-1){printf("创建失败");exit(1);}struct sockaddr_in saddr,caddr;memset(&saddr,0,sizeof(saddr));saddr.sin_family=AF_INET;saddr.sin_port=htons(6000);saddr.sin_addr.s_addr=inet_addr("127.0.0.1");//2.指定套接字的地址,绑定ip和端口int res=bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));if(res==-1){printf("绑定失败");exit(1);}int len=sizeof(caddr);while(1){char buff[128]={0};//3.接收客户端的消息,谁发来数据就接收谁的数据,并没有和任何客户端建立连接recvfrom(sockfd,buff,127,0,(struct sockaddr*)&caddr,&len);//客户端的信息(ip和端口)存放到caddr,caddr指定数据的来源,中记录着是谁发的数据printf("buff(%d)=%s\n",ntohs(caddr.sin_port),buff);//4.向客户端回复数据sendto(sockfd,"ok",2,0,(struct sockaddr*)&caddr,sizeof(caddr));}
}
客户端代码cli.c如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>int main()
{//1.创建套接字int sockfd=socket(AF_INET,SOCK_DGRAM,0);if(sockfd==-1){printf("创建失败");exit(1);}struct sockaddr_in saddr;//服务器的地址,ip和端口memset(&saddr,0,sizeof(saddr));saddr.sin_family=AF_INET;saddr.sin_port=htons(6000);saddr.sin_addr.s_addr=inet_addr("127.0.0.1");int len =sizeof(saddr);while(1){char buff[128]={0};printf("输入数据:");fgets(buff,128,stdin);if(strncmp(buff,"end",3)==0){break;}//2.向服务器端发送数据sendto(sockfd,buff,sizeof(buff),0,(struct sockaddr*)&saddr,sizeof(saddr));memset(buff,0,sizeof(buff));//3.接收服务器端回复的数据recvfrom(sockfd,buff,127,0,(struct sockaddr*)&saddr,&len);printf("buff=%s\n",buff);}//4.关闭套接字close(sockfd);}
运行结果:

从结果可以看出,当服务器端启动之后,可以同时启动多个客户端与客户端通信,但是两个客户端的端口号是不同的。
UDP协议无连接的特点
将服务器端关闭再重启后,客户端依旧可以与服务器端通信,如下图所示:

这是因为服务器端和客户端是没有建立连接的,当服务器端启动之后,收的到底是哪个客户端的消息我们并不知道,哪个客户端发消息,服务器端就收哪个客户端发来的消息。当服务器端关闭之后是不会像TCP编程那样有底层的协议去进行四次挥手通知客户端它要关闭的,客户端不会收到任何信息并且不知道服务器端是否关闭,所以当我们服务器端关闭之后再重新启动不会影响客户端向服务器端发送数据。同理,客户端关闭也不会给服务器端发送任何信息,客户端的关闭也不会影响服务器端。
如果服务器端关闭后,客户端向服务器端发送数据就会发生阻塞,阻塞在客户端的recvfrom这个地方,因为服务器没启动,端口没有人使用,那么数据就会被丢掉,所以没有服务器端给客户端回复数据,所以就会阻塞在recvfrom这个地方。如下图:

此时客户端代码cli.c执行完了sendto,接下来执行recvfrom的时候就被阻塞住了,因为没有服务器端给客户端回复消息,此时发送的aaaaaa发给本主机的6000端口,但是本主机的6000端口没有被占用,也就是6000端口没有被使用,所以所发送的数据aaaaaa就直接被丢掉了,所以也不会有服务器端给客户端回复消息,客户端就会在recvfrom这个地方阻塞住。
UDP协议数据报的特点
将服务器端代码ser.c中的recvfrom那一行的代码修改为如下情况,让服务器端一次只收一个字符:
recvfrom(sockfd,buff,1,0,(struct sockaddr*)&caddr,&len);
此时的运行结果:

出现这样的结果是因为,第一次客户端所发送的"hello",服务器端只收到了一个字符"h",剩下的"ello"被丢掉了,后续的结果也是一样,这是因为UDP协议是数据报服务,不像流式服务一样没有读完会继续读,每次recvfrom就拆一个包,拆一个包要保证把所有的数据都读走,不然剩余的数据就会被丢掉。所以在使用UDP协议的时候必须要保证一次把数据接收完。不用担心两个包合到一起导致收不完数据,因为每次调sendto的时候都要指定对方的地址,这个地址可以一样也可以不一样,所以两个sendto不可能合到一起,因为sendto的目的端可以不一样。不像TCP协议,send一下,再send一下,两次send的内容都会放到同一个缓冲区中,UDP协议是sendto直接打一个包过去,不会出现粘包的现象。数据报服务的特点如下图所示:

相关文章:
Linux UDP编程流程
文章目录 UDP编程流程UDP协议无连接的特点UDP协议数据报的特点 UDP编程流程 UDP 提供的是无连接、不可靠的、数据报服务。服务器端和客户端没有什么本质上的区别。编程流程如下: socket()用来创建套接字,使用 udp 协议时,选择数据报服务 SOC…...
【opencv】多版本安装
安装opencv3.2.0以及对应的付费模块 一、安装多版本OpenCV如何切换 按照如下步骤安装的OpenCV,在CMakeLists.txt文件中,直接指定opencv的版本就可以找到相应版本的OpenCV,为了验证可以在CMakeLists.txt文件中使用如下指令输出版本验证&…...
webpack打包常用配置项
webpack打包配置项 参考链接 文件结构:最基础版 先安装 npm i webpack webpack-cli --dev 运行命令:npx webpack 进行打包 1. 配置webpack.config.js文件: const path require(path); module.exports {mode: development, // 开发环境 …...
回归预测 | MATLAB实现MPA-BiGRU海洋捕食者算法优化双向门控循环单元多输入单输出回归预测(多指标,多图)
回归预测 | MATLAB实现MPA-BiGRU海洋捕食者算法优化双向门控循环单元多输入单输出回归预测(多指标,多图) 目录 回归预测 | MATLAB实现MPA-BiGRU海洋捕食者算法优化双向门控循环单元多输入单输出回归预测(多指标,多图&a…...
selenium_webdriver自动化测试指南
目录 1 引言 4 1.1 目的.. 4 1.2 背景.. 4 1.3 参考资料.. 4 2 安装并引用Selenium2. 5...
红米Note12Turbo解锁BL刷入PixelExperience原生ROM系统详细教程
红米Note12Turbo的兄弟是国外POCO F5 机型,并且该机性价比非常高,国内外销量也还可以,自然不缺第三方ROM适配。目前大家心心念念的原生PixelExperience已成功发布,并且相对来说,适配程度较高,已经达到日用的…...
NoSQL之Redis配置与优化(一)
关系数据库与非关系型数据库 : ●关系型数据库: 关系型数据库是一个结构化的数据库,创建在关系模型(二维表格模型)基础上,一般面向于记录。 SQL 语句(标准数据查询语言)就是一种基于…...
Boost搜索引擎
项目背景 先说一下什么是搜索引擎,很简单,就是我们平常使用的百度,我们把自己想要所有的内容输入进去,百度给我们返回相关的内容.百度一般给我们返回哪些内容呢?这里很简单,我们先来看一下. 搜索引擎基本原理 这里我们简单的说一下我们的搜索引擎的基本原理. 我们给服务器发…...
侧边栏的文章分类、热门文章和热门文章的展示(Go 搭建 qiucode.cn 之九)
早就有言,秋码记录 虽早已不是原来的面貌,但这终究是不防碍我们使用golang来搭建它。 而又为什么是使用golang呢?并非是其他编程语言呢?想必 时候回答【我为什么要学习 Go 语言(golang)】这个问题了 已经给出了答案! 当然,当初学习golang时,不单单是为了搭建一个博客应…...
LeetCode——贪心篇(二)
刷题顺序及思路来源于代码随想录,网站地址:https://programmercarl.com 134. 加油站 在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i1 个加油站需要消耗…...
Linux find
1.find介绍 linux查找命令find是linux运维中很重要、很常用的命令之一,find用于根据指定条件的匹配参数来搜索和查找文件和目录列表,我们可以通过权限、用户、用户组、文件类型、日期、大小等条件来查找文件。 2.find语法 find语法 find [查找路径] …...
UE4实现断线重连功能
断线重连的整体逻辑是 设备离线后,根据需要决定是否保留pawn,还是设备重连后再重新生成一个,然后是断线重连时的验证方式,最后是playerstate重连后的属性保留 重载Playercontroller的PawnLeavingGame,这里是设备断线后࿰…...
nginx笔记
1. nginx 简介 nginx性能比apache强,体现 在io模型方面 76 Pv: UV : 不同浏览器是不同的UV GET 获取 POST 上传 HEAT 只看头 访问网站的流程 1.dns解析 2.cdn 3.tcp 4.web服务器 处理 建立连接 接收请求 处理请求 GET POST等 获取资源 构…...
动态库的制作和使用
动态库和静态库的工作原理 配置环境变量 方式1: 坏处:环境变量是临时的 方式2: 1 用户级别的配置: 进入到/home,找到.bashrc,进入 先去找到库的路径 然后再到.bashrc最后一行输入路径 使其生效 2 系统…...
AWS Glue Pyspark+Athena基础学习汇总
Pyspark 基础学习汇总篇🍎 一、AWS 架构 ① AWS Glue:工作平台,包括脚本的编写以及管理脚本的运行状态以及调度等(主要:数据库配置、ETL和数据转换脚本编写、调度) ② Amazon S3 数据湖(数仓):数据的存储 ③ Athena:(雅典娜)SQL直接编写查询工作台(会产生费用) ④ Q…...
智能合约安全新范式,超越 `require`和`assert`
智能合约安全新范式,超越 require_assert 摘要 不要只为特定的函数写 require 语句;为你的协议写 require 语句。函数遵循检查(requirements)-生效(Effects)-交互(INteractions)协议不变性(Invariants)或 FREI-PI 模式可以帮助你的合约更加安全&#x…...
【ESP-S3-BOX-Lite花屏问题】:Github下载源码(出厂源码factory_demo)编译调试到ESP-S3-BOX-Lite中出现花屏现象
项目场景: 最近拿到了一块乐鑫的 ESP-S3-BOX-Lite (esp-box: ESP-BOX 是乐鑫信息科技) 详细资料(esp32_s3_box_lite) 版本信息 ESP-BOX依赖的 ESP-IDF分支信息支持状态master> release/v5.1 commit id: 22cfbf3…...
Redis集群3.2.11离线安装详细版本(使用Ruby)
1.安装软件准备 1.Redis版本下载 Index of /releases/http://download.redis.io/releases/ 1.2gcc环境准备 GCC(GNU Compiler Collection,GNU编译器套件)是一套用于编译程序代码的开源编译器工具集。它的主要用途是将高级编程语言(如C、C++、Fortran等)编写的源代码转换…...
Ansible自动化运维
目录 前言 一、概述 常见的开源自动化运维工具比较 二、ansible环境搭建 三、ansible模块 (一)、hostname模块 (二)、file模块 (三)、copy模块 (四)、fetch模块 ÿ…...
MSTP + Eth-Trunk配置实验 华为实验手册
1.1 实验介绍 1.1.1 关于本实验 以太网是当今现有局域网LAN(Local Area Network)采用的最通用的通信协议标准,以太网作为一种原理简单、便于实现同时又价格低廉的局域网技术已经成为业界的主流。 本实验主要介绍了LAN网络中的Eth-Trunk技术…...
嵌入式系统调试技术:从JTAG到多核同步的实战指南
1. 嵌入式系统调试技术概述在嵌入式系统开发过程中,调试环节往往占据整个开发周期的40%-60%时间。与通用计算机系统不同,嵌入式系统通常运行在资源受限的环境中,缺乏标准输入输出设备,这使得调试工作更具挑战性。我曾参与过多个工…...
基于MCP协议实现AI助手个性化:Terminal Buddies项目实战解析
1. 项目概述:当你的终端伙伴遇见AI助手 如果你和我一样,每天有大量时间泡在终端和代码编辑器里,那么一个能带来些许乐趣和陪伴感的“数字伙伴”或许能点亮枯燥的编码时光。Terminal Buddies 正是这样一个巧妙结合了复古 ASCII 艺术、轻量级游…...
深度相机三剑客:TOF、双目与结构光的场景化选型指南
1. 深度相机技术入门:从原理到应用 第一次接触深度相机时,我被各种技术名词搞得晕头转向。TOF、双目、结构光听起来都很高大上,但到底有什么区别?经过多年项目实战,我发现这三种技术就像不同的"眼睛"&#…...
从学生成绩表到销售报表:手把手教你用ag-grid列组/行组构建复杂业务表格
企业级销售报表实战:用ag-grid行组与列组构建动态分析系统 当业务数据从Excel迁移到前端可视化系统时,开发团队常面临多维分析的挑战。某零售企业曾因无法实时查看"华东区→浙江省→杭州市"三级维度下的季度销售趋势,导致错失库存调…...
SAP资产会计进阶:深入理解AS91、AB01与ABLDT在期初数据处理中的角色与联动
SAP资产会计核心事务代码解析:AS91、AB01与ABLDT的协同逻辑与实战应用 在SAP S4 HANA资产模块的实施与运维中,期初数据处理往往是项目成败的关键节点。不同于日常资产操作,期初数据迁移涉及历史价值追溯、折旧逻辑重建以及多系统数据对齐等复…...
绝地求生罗技鼠标宏实战指南:5步实现高效压枪技巧
绝地求生罗技鼠标宏实战指南:5步实现高效压枪技巧 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 对于《绝地求生》玩家来说…...
新手也能看懂的SQL注入绕过实战:以BUUCTF的BabySQL靶场为例,手把手教你双写绕过
从零破解BabySQL:双写绕过的艺术与科学 当你第一次接触CTF比赛中的SQL注入题目时,那种既兴奋又困惑的感觉一定记忆犹新。面对BabySQL这样的靶场,新手常会遇到一个典型困境:明明知道应该用union select来获取数据,却发现…...
LogExpert终极指南:三步搞定Windows日志分析难题
LogExpert终极指南:三步搞定Windows日志分析难题 【免费下载链接】LogExpert Windows tail program and log file analyzer. 项目地址: https://gitcode.com/gh_mirrors/lo/LogExpert 想象一下,当你面对一个生产环境问题,需要快速分析…...
Keil5/MDK美化进阶:除了改颜色,这些隐藏的编辑器效率设置你调了吗?
Keil5/MDK美化进阶:解锁编辑器隐藏效率设置 第一次打开Keil5时,我被它那略显单调的界面震惊了——这真的是21世纪的IDE吗?作为一名长期使用现代编辑器的开发者,我几乎立刻开始寻找美化方案。但很快我发现,仅仅改变颜色…...
如何用Rusted PackFile Manager彻底重构全面战争模组开发工作流?
如何用Rusted PackFile Manager彻底重构全面战争模组开发工作流? 【免费下载链接】rpfm Rusted PackFile Manager (RPFM) is a... reimplementation in Rust and Qt6 of PackFile Manager (PFM), one of the best modding tools for Total War Games. 项目地址: h…...
