网络编程——UDP
UDP编程使用套接字(Socket)进行通信。下面是基于UDP协议进行网络编程的基本步骤。
1. 创建套接字
首先,客户端和服务器都需要通过 socket() 系统调用创建一个UDP套接字。
2. 配置地址和端口
UDP是无连接的,因此你不需要像TCP一样使用 bind() 来绑定端口。但你仍然需要为发送和接收数据设置目标地址和端口。
3. 发送和接收数据
1.使用 sendto() 发送数据。
2.使用 recvfrom() 接收数据。
4. 关闭套接字
所有的套接字操作完成后,使用 close() 来关闭套接字。
5. UDP 编程示例
以下是一个简单的UDP服务器和客户端的示例,展示了如何在Linux下进行UDP网络编程。
UDP服务器端程序:
UDP服务器端需要执行以下操作:
创建套接字。
绑定到特定端口。
等待接收客户端消息。
发送响应。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>#define PORT 12345
#define MAX_BUFFER_SIZE 1024int main() {int sockfd;struct sockaddr_in server_addr, client_addr;char buffer[MAX_BUFFER_SIZE];socklen_t client_addr_len = sizeof(client_addr);// 创建UDP套接字sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (sockfd < 0) {perror("Socket creation failed");exit(1);}// 配置服务器地址memset(&server_addr, 0, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_port = htons(PORT);server_addr.sin_addr.s_addr = INADDR_ANY; // 监听所有可用的接口// 绑定套接字到地址和端口if (bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {perror("Bind failed");close(sockfd);exit(1);}printf("UDP server listening on port %d...\n", PORT);// 等待接收客户端消息while (1) {ssize_t recv_len = recvfrom(sockfd, buffer, sizeof(buffer), 0,(struct sockaddr*)&client_addr, &client_addr_len);if (recv_len < 0) {perror("Recvfrom failed");continue;}buffer[recv_len] = '\0'; // null terminate received messageprintf("Received from client: %s\n", buffer);// 发送响应消息const char* response = "Hello, Client!";sendto(sockfd, response, strlen(response), 0, (struct sockaddr*)&client_addr, client_addr_len);}// 关闭套接字close(sockfd);return 0;
}
UDP客户端程序:
UDP客户端需要执行以下操作:
创建套接字。
配置服务器的IP地址和端口。
使用 sendto() 发送数据。
使用 recvfrom() 接收数据。
关闭套接字。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>#define SERVER_IP "127.0.0.1"
#define PORT 12345
#define MAX_BUFFER_SIZE 1024int main() {int sockfd;struct sockaddr_in server_addr;char buffer[MAX_BUFFER_SIZE] = "Hello, Server!";// 创建UDP套接字sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (sockfd < 0) {perror("Socket creation failed");exit(1);}// 配置服务器地址memset(&server_addr, 0, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_port = htons(PORT);server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);// 发送数据到服务器ssize_t send_len = sendto(sockfd, buffer, strlen(buffer), 0,(struct sockaddr*)&server_addr, sizeof(server_addr));if (send_len < 0) {perror("Sendto failed");close(sockfd);exit(1);}// 接收来自服务器的响应ssize_t recv_len = recvfrom(sockfd, buffer, sizeof(buffer), 0, NULL, NULL);if (recv_len < 0) {perror("Recvfrom failed");close(sockfd);exit(1);}buffer[recv_len] = '\0'; // Null-terminate received messageprintf("Received from server: %s\n", buffer);// 关闭套接字close(sockfd);return 0;
}
6. 解释代码
UDP服务器端:
创建套接字:使用 socket() 创建UDP套接字,指定地址族 AF_INET 和套接字类型 SOCK_DGRAM。
绑定端口:使用 bind() 将套接字绑定到指定的端口和地址。这里使用 INADDR_ANY,表示接受来自所有IP地址的连接。
接收数据:服务器通过 recvfrom() 接收客户端发送的数据,recvfrom() 可以返回发送数据的客户端地址信息。
发送数据:使用 sendto() 将响应发送到客户端。
UDP客户端:
创建套接字:使用 socket() 创建UDP套接字,类型为 SOCK_DGRAM。
配置服务器地址:设置目标服务器的IP地址和端口,使用 inet_addr() 将字符串形式的IP转换为 in_addr_t。
发送数据:使用 sendto() 将消息发送到服务器。
接收数据:使用 recvfrom() 接收来自服务器的响应数据。
7. UDP 编程中的一些注意事项
无连接特性:UDP是无连接的,这意味着客户端和服务器不需要建立连接,只要有目标地址和端口,数据就可以发送。
数据可靠性:UDP不保证数据的顺序、完整性和可靠性,数据包可能丢失、重复或乱序。应用程序需要自行处理数据的可靠性问题(如果需要)。
适用于实时应用:因为UDP的头部较小,传输速度较快,适合用于实时通信,如视频流、语音通话等。
广播和组播:UDP支持广播和组播功能,客户端可以使用广播向多个目标发送消息,服务器可以通过组播接收来自多个客户端的消息。
总结
UDP协议通过简单、轻量的机制进行数据传输,适用于对实时性要求高的场合。Linux下的UDP网络编程通过 socket()、sendto() 和 recvfrom() 等系统调用实现数据发送和接收。虽然UDP不提供可靠的传输机制,但它的高效性使得它在许多实时系统中广泛使用。
相关文章:
网络编程——UDP
UDP编程使用套接字(Socket)进行通信。下面是基于UDP协议进行网络编程的基本步骤。 1. 创建套接字 首先,客户端和服务器都需要通过 socket() 系统调用创建一个UDP套接字。 2. 配置地址和端口 UDP是无连接的,因此你不需要像TCP一…...
文件描述符(File Descriptor)
一、介绍 内核(kernel)利用文件描述符(file descriptor)来访问文件。文件描述符是非负整数。打开现存文件或新建文件时,内核会返回一个文件描述符。读写文件也需要使用文件描述符来指定待读写的文件。 二、功能 文件…...
【3天快速入门WPF】12-MVVM
目录 1. 什么是MVVM2. 实现简单MVVM2.1. Part 12.2. Part 21. 什么是MVVM MVVM 是 Model-View-ViewModel 的缩写,是一种用于构建用户界面的设计模式,是一种简化用户界面的事件驱动编程方式。 MVVM 的目标是实现用户界面和业务逻辑之间的彻底分离,以便更好地管理和维护应用…...
钉钉MAKE AI生态大会思考
1. 核心特性 1.1 底层模型开放 除原有模型通义千问外,新接入猎户星空、智普、MinMax、月之暗面、百川智能、零一万物。 1.2 AI搜索 AI搜索贯通企业和个人散落在各地的知识(聊天记录、文档、会议、日程、知识库、项目等),通过大模型对知识逻辑化,直接生成搜索的答案,并…...
[操作系统] 文件的软链接和硬链接
文章目录 引言硬链接(Hard Link)什么是硬链接?硬链接的特性硬链接的用途 软链接(Symbolic Link)什么是软链接?软链接的特性软链接的用途 软硬链接对比文件的时间戳实际应用示例使用硬链接节省备份空间用软链…...
【TI毫米波雷达】DCA1000的ADC原始数据C语言解析及FMCW的Python解析2D-FFT图像
【TI毫米波雷达】DCA1000的ADC原始数据C语言解析及FMCW的Python解析2D-FFT图像 文章目录 ADC原始数据C语言解析Python的2D-FFT图像附录:结构框架雷达基本原理叙述雷达天线排列位置芯片框架Demo工程功能CCS工程导入工程叙述Software TasksData PathOutput informati…...
基于ai技术的视频生成工具
一、通用型AI视频生成工具 腾讯智影 特点:支持数字人播报、文字转视频,提供免费模板和素材库,登录即送5分钟免费时长,每日签到可兑换额外额度。 限制:免费版分辨率较低,部分高级功能需付费。 LunaAI.vid…...
Python Cookbook-2.29 带版本号的文件名
任务 如果你想在改写某文件之前对其做个备份,可以在老文件的名字后面根据惯例加上三个数字的版本号。 解决方案 我们需要编写一个函数来完成备份工作: def VersionFile(file_spec, vtypecopy):import os,shutilif os.path.isfile(file_spec):#检查vtype参数if v…...
阿里云轻量级服务器通过宝塔安装PgVector要点
设置环境变量: export PG_HOME/www/server/pgsql export LD_LIBRARY_PATH$LD_LIBRARY_PATH:/www/server/pgsql/lib export PG_CONFIG/www/server/pgsql/bin/pg_config export PGDATA/www/server/pgsql/data PATH$PATH:$HOME/.local/bin:$HOME/bin:$PG_HOME/bin ali…...
LeeCode题库第三十九题
39.组合总和 项目场景: 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同…...
Android Activity栈关系解析
在 Android 系统中,这些类共同构成了 Activity 任务栈管理的核心架构。它们的关系可以类比为一栋大楼的管理体系,每个类负责不同层级的任务。以下是它们的详细解释和实际场景示例: 1. ActivityRecord(活动记录) 是什么…...
B/B+树与mysql索引
数据结构操作网站:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html B树 算法平均最差空间O(n)O(n)搜索O(log n)O(log n)插入O(log n)O(log n)删除O(log n)O(log n) B树 算法平均最差空间O(n)O(n)搜索O(log n)O(log n)插入O(log n)O(log n)删除O(…...
1.2.3 使用Spring Initializr方式构建Spring Boot项目
本实战概述介绍了如何使用Spring Initializr创建Spring Boot项目,并进行基本配置。首先,通过Spring Initializr生成项目骨架,然后创建控制器HelloController,定义处理GET请求的方法hello,返回HTML字符串。接着…...
【踩坑随笔】`npm list axios echarts`查看npm依赖包报错
npm list axios echarts查看npm依赖包出现以下报错,原因就是包的版本匹配问题,按照提示降axios版本或者自己升找合适的got版本,我这里是选择了降版本。本文记录仅做解决思路参考不一定适配大家的实际情况。 weed-detection-system1.0.0 E:\P…...
十四届蓝桥杯JAVA-b组-合并石子
点我写题 思路:区间dp和缝合dp板子题,先用个dp[i][j][k]表示考虑区间[i,j]合并成颜色k的最小代价,然后用min[i][j]存一下[i,j]区间合并的最小代价,即min(dp[i][j][0-2]),has[i][j]表示区间[i,j]是否能合并,…...
芯片算力的概念
根据ISO 26262标准要求,要获得ASIL-D(汽车安全完整性等级最高级)认证,企业需满足以下核心条件: 一、体系与流程要求 功能安全管理体系认证 必须建立符合ISO 26262标准的全生命周期安全管理体系,涵盖需求分…...
leetcode日记(74)合并两个有序数组
还是很简单很基础的。一开始在思考后面补的全是0怎么知道0是原本数组的还是要替换成nums2的元素的,后来发现其实一开始可以直接剔除nums1后的n个元素…… 使用双指针: class Solution { public:void merge(vector<int>& nums1, int m, vecto…...
Git 安装与配置一站式指南
🏝️专栏:计算机操作系统 🌅主页:猫咪-9527-CSDN博客 “欲穷千里目,更上一层楼。会当凌绝顶,一览众山小。” 目录 一、环境检查与旧版本处理 1. 检查 Git 安装状态 2. 卸载旧版本(可选&…...
【数据结构】堆与二叉树
一、树的概念 1.1 什么是树? 树是一种非线性的数据结构,其由 n 个 ( n > 0 ) 有限节点所组成的一个有层次关系的集合。之所以称其为树,是因为其逻辑结构看起来像是一颗倒挂的树。 在树中,有一个特殊的节点称为根节点…...
游戏引擎学习第128天
开始 然而,我们仍然有一些工作要做,渲染部分并没有完全完成。虽然现在已经能够运行游戏,而且帧率已经可以接受,但仍然有一些东西需要进一步完善。正在使用调试构建编译版本,虽然调试版本的性能不如优化版本࿰…...
我们应该如何优化UI(基于UGUI)
这是一道面试题,下面,我们来详细分析这个问题。 目录 1. 减少 Draw Call 合理设置图集 避免材质和 Shader 的频繁切换 减少 UI 元素的重叠 2. 优化UI布局 3. 优化UI元素的渲染 4.优化UI动画 5. 优化 UI 事件处理 6. 运行时优化 1. 减少 Draw C…...
自然语言处理:词频-逆文档频率
介绍 大家好,博主又来给大家分享知识了。本来博主计划完成稠密向量表示的内容分享后,就开启自然语言处理中文本表示的讲解。可在整理分享资料的时候,博主发现还有个知识点,必须得单独拎出来好好说道说道。 这就是TF-IDF…...
快速在本地运行SpringBoot项目的流程介绍
目录 前言 一、环境配置 1.1Java环境 1.2Maven环境 1.3IntelliJ IDEA安装 1.4MySql安装 二、项目导入与启动的过程 2.1Maven镜像和本地仓库 2.1.2镜像配置 2.1.3配置本地仓库 2.2导入项目与启动 2.2.1加载Maven设置 2.2.2配置jdk与java版本 2.2.3创建数据库 2.2…...
【后端开发面试题】每日 3 题(三)
✍个人博客:Pandaconda-CSDN博客 📣专栏地址:https://blog.csdn.net/newin2020/category_12903849.html 📚专栏简介:在这个专栏中,我将会分享后端开发面试中常见的面试题给大家~ ❤️如果有收获的话&#x…...
Java容器异常分析与恢复实战指南
引言 在云原生时代,Java应用的容器化部署已成为主流。然而,容器环境下的异常处理相比传统部署模式更为复杂,特别是在处理内存溢出(OOM)、资源限制和服务恢复等方面面临新的挑战。本文将结合实战经验,系统讲解Java容器异常的分析方法、恢复策略与最佳实践。 一、容器化Java异常…...
SpringBoot 端口配置
在Spring Boot中,配置应用程序的监听端口有多种方式。以下是常见的几种方法: 1. 通过 application.properties 或 application.yml 文件配置 application.properties server.port8081application.yml server:port: 8081如果没有显式配置 server.port…...
Python 数据结构 4.单向链表
惟愿春日不迟,相逢终有时 —— 25.3.2 一、单向链表的基本概念 1.单向链表的概念 对于顺序存储的结构,最大的缺点就是:插入 和 删除 的时候需要移动大量的元素,所以基于前人的智慧,他们发明了链表。 链表是由一个个结…...
LeeCode题库第四十题
40.组合总和II 项目场景: 给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意:解集不能包含重复的组合。 示…...
AI日报 - 2025年3月2日 - 推特版
AI日报 - 2025年3月2日 - 推特版 🌟 今日概览(60秒速览) ▎🤖 AGI突破 | Anthropic预测AGI将于2027年实现 🔬 Sholto Douglas加入团队,开源社区推动AGI竞赛加速 ▎💼 商业动向 | 腾讯发布Hunyua…...
Kotlin语言特性(一):空安全、扩展函数与协程
Kotlin语言特性(一):空安全、扩展函数与协程 一、引言 Kotlin作为Android官方推荐的开发语言,相比Java具有诸多现代化特性。本文将重点介绍Kotlin三个最具特色的语言特性:空安全、扩展函数和协程,并结合A…...
