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

Linux网络编程基础(UDP socket编程)

UDP用户数据报协议是一种无连接的传输层协议与TCP不同它不保证数据包的顺序和可靠性但其简单性和低延迟特性使其在实时应用中非常有用。一、UDP协议核心特性UDP作为传输层协议与TCP的“可靠连接”不同它具有以下特点无连接通信前无需建立三次握手直接发送数据报不可靠不保证数据有序到达也不重传丢失的数据包面向数据报数据以固定大小的“数据报”为单位传输低延迟省去连接建立和确认机制适合实时场景如聊天、直播UDP适合用于一次传送少量数据、对可靠性要求不高的应用环境。例如流媒体、在线游戏、DNS查询等场景。二、UDP编程模型UDP是无连接的先启动哪一端都不会报错。UDP编程与TCP的核心差异在于“无连接”特性——无需listen、accept、connect流程直接通过sendto与recvfrom完成数据收发。服务器端流程创建套接字使用socket(AF_INET, SOCK_DGRAM, 0)创建UDP套接字绑定地址使用bind()将套接字与IP地址和端口号关联收发数据使用recvfrom()/sendto()进行数据交互关闭套接字使用close()释放资源客户端流程创建套接字使用socket(AF_INET, SOCK_DGRAM, 0)创建UDP套接字收发数据使用sendto()/recvfrom()进行数据交互关闭套接字使用close()释放资源三、核心API函数详解1. socket() - 创建套接字int sockfd socket(AF_INET, SOCK_DGRAM, 0);AF_INETIPv4协议族SOCK_DGRAM数据报套接字对应UDP协议区别于TCP的SOCK_STREAM第三个参数通常设为0表示由内核自动选择协议2. bind() - 绑定地址服务器端必须UDP服务器端必须调用bind函数将套接字绑定到固定的本地端口——客户端需要通过该端口定位服务器而UDP客户端通常无需绑定系统自动分配临时端口。struct sockaddr_in addr; addr.sin_family AF_INET; addr.sin_port htons(12345); addr.sin_addr.s_addr htonl(INADDR_ANY); bind(sockfd, (struct sockaddr *)addr, sizeof(addr));3. sendto() - 发送数据UDP无连接特性决定了其发送数据时需明确指定目标地址——sendto函数正是为此设计它将数据报发送到指定的服务器端地址无需提前建立连接区别于TCP的send。ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);重要说明sendto返回成功仅表示数据已交给内核发送缓冲区不保证对方能接收UDP无确认机制这与TCP的send有本质区别。4. recvfrom() - 接收数据UDP服务器端通过recvfrom接收客户端发送的数据报同时获取发送方客户端的地址信息以便后续回复。ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);阻塞特性默认情况下若套接字无数据可接收recvfrom会一直阻塞直到有数据报到达或被信号中断。5. close() - 关闭套接字close(sockfd);四、完整代码示例UDP服务器端代码#include stdio.h #include stdlib.h #include string.h #include sys/socket.h #include netinet/in.h #include arpa/inet.h #include unistd.h #define SERVER_PORT 8888 #define BUFFER_SIZE 1024 int main() { int server_fd; struct sockaddr_in server_addr, client_addr; socklen_t client_addr_len sizeof(client_addr); char buffer[BUFFER_SIZE]; // 1. 创建UDP套接字 if ((server_fd socket(AF_INET, SOCK_DGRAM, 0)) 0) { perror(socket creation failed); exit(EXIT_FAILURE); } // 2. 绑定地址 memset(server_addr, 0, sizeof(server_addr)); server_addr.sin_family AF_INET; server_addr.sin_addr.s_addr htonl(INADDR_ANY); // 监听所有网卡 server_addr.sin_port htons(SERVER_PORT); if (bind(server_fd, (struct sockaddr *)server_addr, sizeof(server_addr)) 0) { perror(bind failed); close(server_fd); exit(EXIT_FAILURE); } printf(UDP Server listening on port %d...\n, SERVER_PORT); // 3. 循环收发数据 while (1) { memset(buffer, 0, BUFFER_SIZE); // 接收客户端数据 ssize_t recv_len recvfrom(server_fd, buffer, BUFFER_SIZE - 1, 0, (struct sockaddr *)client_addr, client_addr_len); if (recv_len 0) { perror(recvfrom failed); continue; } buffer[recv_len] \0; printf(Received from %s:%d: %s\n, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port), buffer); // 回显数据到客户端 sendto(server_fd, buffer, strlen(buffer), 0, (struct sockaddr *)client_addr, client_addr_len); } close(server_fd); return 0; }UDP客户端代码#include stdio.h #include stdlib.h #include string.h #include sys/socket.h #include netinet/in.h #include arpa/inet.h #include unistd.h #define SERVER_PORT 8888 #define BUFFER_SIZE 1024 int main() { int client_fd; struct sockaddr_in server_addr; char buffer[BUFFER_SIZE]; // 1. 创建UDP套接字 if ((client_fd socket(AF_INET, SOCK_DGRAM, 0)) 0) { perror(socket creation failed); exit(EXIT_FAILURE); } // 2. 配置服务器地址 memset(server_addr, 0, sizeof(server_addr)); server_addr.sin_family AF_INET; server_addr.sin_port htons(SERVER_PORT); inet_pton(AF_INET, 127.0.0.1, server_addr.sin_addr); // 3. 发送数据 const char *message Hello, UDP Server!; sendto(client_fd, message, strlen(message), 0, (struct sockaddr *)server_addr, sizeof(server_addr)); printf(Sent: %s\n, message); // 4. 接收回显数据 socklen_t addr_len sizeof(server_addr); ssize_t recv_len recvfrom(client_fd, buffer, BUFFER_SIZE - 1, 0, (struct sockaddr *)server_addr, addr_len); if (recv_len 0) { buffer[recv_len] \0; printf(Received: %s\n, buffer); } close(client_fd); return 0; }五、UDP与TCP编程的关键差异维度UDPTCP连接方式无连接直接发送数据报面向连接需三次握手建立连接可靠性不可靠不保证数据到达可靠有确认重传机制数据边界保留消息边界流式协议无消息边界需自行处理粘包服务端流程socket→bind→recvfrom/sendtosocket→bind→listen→accept→recv/send客户端流程socket→sendto/recvfromsocket→connect→send/recv适用场景实时音视频、在线游戏、DNS查询文件传输、网页浏览、邮件服务六、错误处理所有系统调用都可能出错合适的错误处理能提高程序的健壮性。使用errno来检查错误代码并利用perror()或strerror()来输出或处理错误信息。常见错误处理示例if (sendto(sockfd, message, strlen(message), 0, (struct sockaddr *)dest_addr, sizeof(dest_addr)) 0) { perror(sendto failed); // 根据errno进行相应处理 }七、UDP编程的注意事项数据报大小限制UDP数据报最大64KB包括头部建议发送数据控制在1472字节以内以太网MTU 1500 - IP头部20 - UDP头部8以避免分片。UDP套接字没有粘包问题但是不能替代TCP套接字因为UDP协议有一个缺陷如果数据发送的途中丢失则数据就丢失了而TCP则不会有这种缺陷。空数据的处理UDP协议是数据报协议传入的数据可为空在传输过程中UDP会对数据进行内部的拼接和处理。断开链接的影响UDP协议是通过解析对方数据中的IP和端口来返回数据的所以一方发生问题并不会影响到另一方。八、进阶应用场景基于UDP可以构建多种实际应用例如回显服务器接收客户端消息并原样返回是UDP编程的“Hello World”英译汉字典服务客户端发送英文单词服务器返回中文释义多线程聊天室使用多线程处理多个客户端实现实时群聊功能这些应用展示了UDP在实际开发中的灵活性和实用性掌握基础后可以进一步探索更复杂的网络应用开发。处理大量并发客户端时可能需要使用多线程pthread库或多进程fork系统调用来实现。

相关文章:

Linux网络编程基础(UDP socket编程)

UDP(用户数据报协议)是一种无连接的传输层协议,与TCP不同,它不保证数据包的顺序和可靠性,但其简单性和低延迟特性使其在实时应用中非常有用。一、UDP协议核心特性UDP作为传输层协议,与TCP的“可靠连接”不同…...

c++乱码问题

大家下载vs2026或者更新时,可能会出现乱码问题点击工具,进入选项,在环境列表里找到文档,下滑到底部,勾选使用特定编码保存文件然后退出就可以了。如果还是存在问题,将自己的代码保存,重新新建一…...

Windows安卓子系统终极优化指南:如何通过WSABuilds实现完美Android体验

Windows安卓子系统终极优化指南:如何通过WSABuilds实现完美Android体验 【免费下载链接】WSABuilds Run Windows Subsystem For Android on your Windows 10 and Windows 11 PC using prebuilt binaries with Google Play Store (MindTheGapps) and/or Magisk or Ke…...

终极指南:3步免费搞定Android Studio中文界面,开发效率提升50%!

终极指南:3步免费搞定Android Studio中文界面,开发效率提升50%! 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本) 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChineseL…...

UE5.1实战:用MySQL插件做个游戏内数据查询器(附完整蓝图)

UE5.1实战:构建高性能游戏内MySQL数据查询系统在虚幻引擎5.1中集成数据库功能已经成为现代游戏开发的重要需求。无论是玩家排行榜、道具管理系统还是实时数据分析,直接访问数据库都能显著提升开发效率和游戏体验。本文将带你从零开始构建一个完整的游戏内…...

Windows热键冲突终极指南:3分钟找出偷走你快捷键的“小偷“

Windows热键冲突终极指南:3分钟找出偷走你快捷键的"小偷" 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective …...

5分钟快速解锁中兴光猫:终极免费工具zteOnu完整指南

5分钟快速解锁中兴光猫:终极免费工具zteOnu完整指南 【免费下载链接】zteOnu A tool that can open ZTE onu device factory mode 项目地址: https://gitcode.com/gh_mirrors/zt/zteOnu 对于网络管理员和技术爱好者来说,中兴光猫的权限限制常常成…...

量子循环神经网络在混沌时序预测中的参数效率与架构对比

1. 项目概述 最近几年,量子机器学习(QML)的热度持续攀升,大家都想看看,用量子计算那套“叠加”和“纠缠”的玩法来处理经典问题,到底能不能带来点惊喜。时序预测,尤其是混沌系统预测&#xff0c…...

从酒店评论到情感分析:手把手教你用fastText做文本分类(Python实战避坑指南)

从酒店评论到情感分析:fastText文本分类实战全解析 当产品经理甩给你一份未经处理的酒店评论数据集,要求48小时内给出情感倾向分析报告时,作为工程师的你该如何应对?本文将带你用fastText这个轻量级工具,从原始数据到…...

对比直接使用官方API,Taotoken在计费透明性上的实际感受

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 对比直接使用官方API,Taotoken在计费透明性上的实际感受 1. 引言:从多模型调用到费用感知的转变 在同时接…...

Wand-Enhancer终极指南:三步免费解锁WeMod专业版所有功能

Wand-Enhancer终极指南:三步免费解锁WeMod专业版所有功能 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer 还在为WeMod免费版的限制而烦恼吗&…...

IDE 重构(Refactoring)详解 + 实例代码

IDE 重构(Refactoring)详解 实例代码 重构是指在不改变代码外部行为的前提下,对代码内部结构进行调整、优化,使代码更易读、易维护、易扩展的过程。IDE(集成开发环境)是重构的最强助手,它能自动…...

深入解析AlienFX Tools:从硬件直连到个性化灯光控制的完整技术方案

深入解析AlienFX Tools:从硬件直连到个性化灯光控制的完整技术方案 【免费下载链接】alienfx-tools Alienware systems lights, fans, and power control tools and apps 项目地址: https://gitcode.com/gh_mirrors/al/alienfx-tools 在Alienware设备生态中&…...

2026国安部重磅披露:境外间谍如何利用民用路由器构建窃密跳板?全链路技术解析与防御指南

一、引言:从"网速变慢"到国家级网络窃密 2026年5月20日,国家安全部官方微信公众号发布紧急通报,披露了一起严重的境外间谍情报机关网络窃密案件。与以往直接攻击政府或企业服务器不同,此次攻击者将目标锁定在了最容易被…...

Python调用WebAssembly破解APP签名算法实战

1. 这不是“调用JS”,而是把WebAssembly当真实CPU来调试你有没有遇到过这样的情况:抓包看到某资讯APP的请求里,sign参数像雪花一样每秒变一个,长度固定32位,全是小写字母加数字;Fiddler里点开响应&#xff…...

Python运算符:成员运算符(in/not in)的使用场景

Python运算符:成员运算符(in/not in)的使用场景📚 本章学习目标:深入理解成员运算符(in/not in)的使用场景的核心概念与实践方法,掌握关键技术要点,了解实际应用场景与最…...

CVE-2026-35397深度解析:Jupyter Server路径遍历漏洞,CVSS 8.8高危威胁数据科学全生态

一、引言:数据科学基础设施的"心脏出血" Jupyter生态是全球数据科学与AI开发领域的事实标准,据Stack Overflow 2026年开发者调查显示,超过87%的数据科学家和AI工程师日常使用Jupyter Notebook/Lab进行代码开发、数据分析和模型训练…...

18分钟攻陷GitHub!Nx Console投毒事件深度复盘:3800个核心仓库泄露的供应链安全警示

摘要:2026年5月20日,全球最大代码托管平台GitHub遭遇史上最严重的供应链攻击之一。黑客组织TeamPCP通过投毒VS Code扩展市场中的Nx Console v18.95.0版本,仅用18分钟、28次下载就成功渗透GitHub内部网络,窃取了包括Copilot、CodeQ…...

5个理由告诉你为什么Mermaid Live Editor是图表创作的效率神器

5个理由告诉你为什么Mermaid Live Editor是图表创作的效率神器 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-live-editor …...

Android 13 HTTPS抓包失效原因与Proxyman实战解决方案

1. 为什么Android 13上抓HTTPS包突然变难了?从Fiddler/Charles失效说起 你是不是也遇到过:上周还能用Fiddler在Android 12真机上稳稳抓到某电商App的登录接口,升级到Android 13后,所有HTTPS请求全变成“Connection refused”或直接…...

JMeter中稳定获取与传递Token的三种实战方案

1. 为什么token获取总在JMeter脚本里“掉链子”做接口测试的同行应该都踩过这个坑:明明API文档写得清清楚楚,Postman里一调一个准,可一到JMeter里,登录接口返回了token,后续请求却始终401——Header里token字段空着、变…...

STM32F407 ADC采样值跳得厉害?HAL库时钟配置与软件滤波避坑指南

STM32F407 ADC采样值跳得厉害?HAL库时钟配置与软件滤波避坑指南 在嵌入式系统开发中,ADC(模数转换器)的稳定性直接关系到整个系统的测量精度。特别是对于STM32F407这类高性能MCU,当应用于电源监控、医疗设备或工业传感…...

Transformer解码器在量子纠错中的应用:突破表面码实时解码瓶颈

1. 项目概述与核心挑战 量子计算这行干久了,你总会遇到一个绕不开的“拦路虎”:量子纠错。这玩意儿是通往实用化、容错量子计算机的必经之路,但其中的解码问题,尤其是针对表面码这类稳定子码的解码,其复杂度和实时性要…...

中兴光猫深度管理:用zteOnu工具解锁隐藏的管理权限

中兴光猫深度管理:用zteOnu工具解锁隐藏的管理权限 【免费下载链接】zteOnu A tool that can open ZTE onu device factory mode 项目地址: https://gitcode.com/gh_mirrors/zt/zteOnu 想象一下,你正在管理一个企业网络,面对几十台中兴…...

Windows HEIC缩略图终极指南:让iPhone照片在资源管理器中完美显示

Windows HEIC缩略图终极指南:让iPhone照片在资源管理器中完美显示 【免费下载链接】windows-heic-thumbnails Enable Windows Explorer to display thumbnails for HEIC/HEIF files 项目地址: https://gitcode.com/gh_mirrors/wi/windows-heic-thumbnails 你…...

3步实现网易云音乐插件管理,让你的音乐体验焕然一新

3步实现网易云音乐插件管理,让你的音乐体验焕然一新 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 还在为网易云音乐功能单一而烦恼吗?是否曾想过让音乐播放器…...

Frida Spawn与Attach模式深度解析:Android加固对抗决策指南

1. 为什么刚学Frida的人总在Spawn和Attach之间反复横跳? “Frida Hook跑不起来”——这是我过去三年在安全技术社区、逆向学习群、CTF训练营里听到最多的一句抱怨。但真正拆开看,90%的问题根本不是代码写错了,也不是目标App加固太强&#xff…...

CNN 卷积神经网络面试全集|卷积、池化、感受野

前言 计算机视觉算法岗必考核心就是 CNN,从基础卷积运算、池化操作,到经典网络结构、感受野、参数量计算全是高频考题。本文整理最全 CNN 面试精简答案,条理清晰直接背诵,视觉方向面试稳稳通关。 一、CNN 整体三大核心结构 卷积层:提取局部纹理、边缘、形状等空间特征 池…...

突破百度网盘速度壁垒:Python直链解析工具的技术实现与应用

突破百度网盘速度壁垒:Python直链解析工具的技术实现与应用 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 在数字资源共享的时代,百度网盘作为国内主流…...

别再手动触发ADC了!用STM32CubeMX配置定时器触发+DMA搬运,实现精准采样(附F1/F4差异说明)

STM32CubeMX定时器触发ADCDMA全自动采样实战指南 在嵌入式数据采集系统中,ADC采样的精准度和效率直接影响整个系统的性能表现。传统的手动触发方式不仅占用CPU资源,还难以保证采样间隔的一致性。本文将深入解析如何利用STM32CubeMX配置定时器触发ADC配合…...