当前位置: 首页 > news >正文

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 提供的是无连接、不可靠的、数据报服务。服务器端和客户端没有什么本质上的区别。编程流程如下&#xff1a; socket()用来创建套接字&#xff0c;使用 udp 协议时&#xff0c;选择数据报服务 SOC…...

【opencv】多版本安装

安装opencv3.2.0以及对应的付费模块 一、安装多版本OpenCV如何切换 按照如下步骤安装的OpenCV&#xff0c;在CMakeLists.txt文件中&#xff0c;直接指定opencv的版本就可以找到相应版本的OpenCV&#xff0c;为了验证可以在CMakeLists.txt文件中使用如下指令输出版本验证&…...

webpack打包常用配置项

webpack打包配置项 参考链接 文件结构&#xff1a;最基础版 先安装 npm i webpack webpack-cli --dev 运行命令&#xff1a;npx webpack 进行打包 1. 配置webpack.config.js文件&#xff1a; const path require(path); module.exports {mode: development, // 开发环境 …...

回归预测 | MATLAB实现MPA-BiGRU海洋捕食者算法优化双向门控循环单元多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现MPA-BiGRU海洋捕食者算法优化双向门控循环单元多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现MPA-BiGRU海洋捕食者算法优化双向门控循环单元多输入单输出回归预测&#xff08;多指标&#xff0c;多图&a…...

selenium_webdriver自动化测试指南

目录 1 引言 4 1.1 目的.. 4 1.2 背景.. 4 1.3 参考资料.. 4 2 安装并引用Selenium2. 5...

红米Note12Turbo解锁BL刷入PixelExperience原生ROM系统详细教程

红米Note12Turbo的兄弟是国外POCO F5 机型&#xff0c;并且该机性价比非常高&#xff0c;国内外销量也还可以&#xff0c;自然不缺第三方ROM适配。目前大家心心念念的原生PixelExperience已成功发布&#xff0c;并且相对来说&#xff0c;适配程度较高&#xff0c;已经达到日用的…...

NoSQL之Redis配置与优化(一)

关系数据库与非关系型数据库 &#xff1a; ●关系型数据库&#xff1a; 关系型数据库是一个结构化的数据库&#xff0c;创建在关系模型&#xff08;二维表格模型&#xff09;基础上&#xff0c;一般面向于记录。 SQL 语句&#xff08;标准数据查询语言&#xff09;就是一种基于…...

Boost搜索引擎

项目背景 先说一下什么是搜索引擎,很简单,就是我们平常使用的百度,我们把自己想要所有的内容输入进去,百度给我们返回相关的内容.百度一般给我们返回哪些内容呢?这里很简单,我们先来看一下. 搜索引擎基本原理 这里我们简单的说一下我们的搜索引擎的基本原理. 我们给服务器发…...

侧边栏的文章分类、热门文章和热门文章的展示(Go 搭建 qiucode.cn 之九)

早就有言,秋码记录 虽早已不是原来的面貌,但这终究是不防碍我们使用golang来搭建它。 而又为什么是使用golang呢?并非是其他编程语言呢?想必 时候回答【我为什么要学习 Go 语言(golang)】这个问题了 已经给出了答案! 当然,当初学习golang时,不单单是为了搭建一个博客应…...

LeetCode——贪心篇(二)

刷题顺序及思路来源于代码随想录&#xff0c;网站地址&#xff1a;https://programmercarl.com 134. 加油站 在一条环路上有 n 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车&#xff0c;从第 i 个加油站开往第 i1 个加油站需要消耗…...

Linux find

1.find介绍 linux查找命令find是linux运维中很重要、很常用的命令之一&#xff0c;find用于根据指定条件的匹配参数来搜索和查找文件和目录列表&#xff0c;我们可以通过权限、用户、用户组、文件类型、日期、大小等条件来查找文件。 2.find语法 find语法 find [查找路径] …...

UE4实现断线重连功能

断线重连的整体逻辑是 设备离线后&#xff0c;根据需要决定是否保留pawn&#xff0c;还是设备重连后再重新生成一个&#xff0c;然后是断线重连时的验证方式&#xff0c;最后是playerstate重连后的属性保留 重载Playercontroller的PawnLeavingGame,这里是设备断线后&#xff0…...

nginx笔记

1. nginx 简介 nginx性能比apache强&#xff0c;体现 在io模型方面 76 Pv&#xff1a; UV : 不同浏览器是不同的UV GET 获取 POST 上传 HEAT 只看头 访问网站的流程 1.dns解析 2.cdn 3.tcp 4.web服务器 处理 建立连接 接收请求 处理请求 GET POST等 获取资源 构…...

动态库的制作和使用

动态库和静态库的工作原理 配置环境变量 方式1&#xff1a; 坏处&#xff1a;环境变量是临时的 方式2&#xff1a; 1 用户级别的配置&#xff1a; 进入到/home&#xff0c;找到.bashrc&#xff0c;进入 先去找到库的路径 然后再到.bashrc最后一行输入路径 使其生效 2 系统…...

AWS Glue Pyspark+Athena基础学习汇总

Pyspark 基础学习汇总篇🍎 一、AWS 架构 ① AWS Glue:工作平台,包括脚本的编写以及管理脚本的运行状态以及调度等(主要:数据库配置、ETL和数据转换脚本编写、调度) ② Amazon S3 数据湖(数仓):数据的存储 ③ Athena:(雅典娜)SQL直接编写查询工作台(会产生费用) ④ Q…...

智能合约安全新范式,超越 `require`和`assert`

智能合约安全新范式&#xff0c;超越 require_assert 摘要 不要只为特定的函数写 require 语句&#xff1b;为你的协议写 require 语句。函数遵循检查(requirements)-生效(Effects)-交互(INteractions)协议不变性(Invariants)或 FREI-PI 模式可以帮助你的合约更加安全&#x…...

【ESP-S3-BOX-Lite花屏问题】:Github下载源码(出厂源码factory_demo)编译调试到ESP-S3-BOX-Lite中出现花屏现象

项目场景&#xff1a; 最近拿到了一块乐鑫的 ESP-S3-BOX-Lite &#xff08;esp-box: ESP-BOX 是乐鑫信息科技&#xff09; 详细资料&#xff08;esp32_s3_box_lite&#xff09; 版本信息 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模块 &#xff08;一&#xff09;、hostname模块 &#xff08;二&#xff09;、file模块 &#xff08;三&#xff09;、copy模块 &#xff08;四&#xff09;、fetch模块 &#xff…...

MSTP + Eth-Trunk配置实验 华为实验手册

1.1 实验介绍 1.1.1 关于本实验 以太网是当今现有局域网LAN&#xff08;Local Area Network&#xff09;采用的最通用的通信协议标准&#xff0c;以太网作为一种原理简单、便于实现同时又价格低廉的局域网技术已经成为业界的主流。 本实验主要介绍了LAN网络中的Eth-Trunk技术…...

AEB紧急制动系统与carsim及simulink联仿技术:卓越效果与性能的完美结合

紧急制动系统AEB&#xff0c;carsim与simulink联仿&#xff0c;效果极好 &#xff0c;踩下刹车的那一刻&#xff0c;方向盘突然传来剧烈震动。盯着屏幕里那辆虚拟的前车尾灯&#xff0c;我手心全是汗——这已经是今天第三次测试紧急制动了。Carsim里那台SUV正以60km/h的速度冲向…...

JavaScript动态交互:在网页中实时调整参数并预览LiuJuan生成效果

JavaScript动态交互&#xff1a;在网页中实时调整参数并预览LiuJuan生成效果 你是不是也遇到过这种情况&#xff1f;想用AI模型生成图片&#xff0c;但每次调整参数都要在代码里改来改去&#xff0c;然后重新运行脚本&#xff0c;等半天才能看到效果。整个过程就像在开盲盒&am…...

用SUSE Linux+PHPStudy快速搭建FusionAccess测试环境(避坑指南)

用SUSE LinuxPHPStudy快速搭建FusionAccess测试环境&#xff08;避坑指南&#xff09; 在数字化转型浪潮中&#xff0c;桌面云技术正成为企业IT架构革新的关键推手。FusionAccess作为业界领先的虚拟桌面解决方案&#xff0c;其灵活性和高效性备受开发者青睐。然而&#xff0c;传…...

十 438. 找到字符串中所有字母异位词

438. 找到字符串中所有字母异位词https://leetcode.cn/problems/find-all-anagrams-in-a-string/ 给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词 的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 示例 1: 输入: s "cbaebabacd"…...

LongCat-Image-Edit图片编辑神器:5分钟快速部署,一句话精准改图

LongCat-Image-Edit图片编辑神器&#xff1a;5分钟快速部署&#xff0c;一句话精准改图 1. 产品核心能力介绍 LongCat-Image-Edit是美团LongCat团队推出的开源图像编辑模型&#xff0c;它让复杂的图片编辑变得像说话一样简单。这个模型有三大杀手锏&#xff1a; 一句话精准编…...

MySQL局域网远程连接测试教程

MySQL局域网远程连接测试教程1本地服务器安装MySQL服务器&#xff0c;安装MySQL shell, Workbench(非必须)防火墙配置2远程访问用户电脑配置IP配置安装 Workbench客户端1本地服务器 安装MySQL服务器&#xff0c;安装MySQL shell, Workbench(非必须) 点击右下角的Advanced Opt…...

从Safetensors到GGUF:利用llama.cpp解锁Ollama模型部署新路径

1. 为什么需要从Safetensors转换到GGUF格式 最近在魔塔社区下载了几个热门的大模型&#xff0c;发现都是safetensors格式的&#xff0c;但直接扔进Ollama里根本跑不起来。这个问题困扰了我好几天&#xff0c;直到发现了llama.cpp这个神器。safetensors其实是Hugging Face生态中…...

Science重磅指南:如何打造高影响力论文摘要?附Abstract写作黄金法则!

1. 科学论文摘要的黄金结构 写论文摘要就像给陌生人讲一个精彩的故事——要在短短200字内让人眼前一亮。我在Nature和Science上发过几篇论文&#xff0c;也审过上百篇投稿&#xff0c;发现顶级期刊的摘要其实有套"万能公式"。这个公式的核心是把摘要拆解成7个关键部分…...

Super Qwen Voice World效果惊艳:‘金币数量’HUD实时反映生成计数

Super Qwen Voice World效果惊艳&#xff1a;‘金币数量’HUD实时反映生成计数 "Its-a me, Qwen!" 欢迎来到基于 Qwen3-TTS 构建的复古像素风语气设计中心。在这里&#xff0c;配音不再是枯燥的参数调节&#xff0c;而是一场 8-bit 的声音冒险&#xff01; 1. 视觉盛…...

Elasticsearch踩坑记录:scaled_float字段查询结果和你想的不一样?

Elasticsearch中的scaled_float&#xff1a;为什么你的查询结果总是不准确&#xff1f; 刚接触Elasticsearch的开发者经常会遇到一个令人困惑的现象&#xff1a;明明存储的是精确的浮点数&#xff0c;查询时却返回了意料之外的结果。这背后往往与scaled_float字段类型的特殊处理…...