[网络] [TCP] Linux UDP Socket 学习指南

news/2025/10/26 0:13:58/文章来源:https://www.cnblogs.com/migrator/p/19166172
[网络] [TCP] Linux UDP Socket 学习指南

📘 Linux UDP Socket 学习指南

适合初学者理解 UDP 原理与在 Linux 下编写 UDP 程序。
对比 TCP,它更轻量、更快,但不保证可靠传输。


🧠 一、UDP 是什么?

1. UDP(User Datagram Protocol)

UDP 是一种无连接、不可靠的传输层协议。

特性 说明
无连接 通信前不需要三次握手
不可靠 不保证数据按顺序、不保证送达
面向报文 一次发送/接收对应一个完整数据包
轻量快速 头部开销小,适合实时通信

可以理解为:

TCP 像“打电话”,需要建立连接;
UDP 像“发短信”,直接发出去,不管对方是否收到。


🧩 二、UDP 通信流程

UDP 通信流程比 TCP 简单得多:

阶段 客户端 服务端
创建Socket socket() socket()
绑定端口 (可选) bind()
发送/接收 sendto() / recvfrom() sendto() / recvfrom()
关闭Socket close() close()

没有 listen()accept()connect()


🧱 三、UDP 服务端与客户端示例

✅ 服务端(udp_server.c)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>int main() {int sockfd;struct sockaddr_in server_addr, client_addr;socklen_t client_len = sizeof(client_addr);char buffer[1024];// 1. 创建UDP Socketsockfd = socket(AF_INET, SOCK_DGRAM, 0);if (sockfd < 0) {perror("socket error");exit(1);}// 2. 绑定IP和端口server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = INADDR_ANY;server_addr.sin_port = htons(5000);if (bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {perror("bind error");exit(1);}printf("UDP server listening on port 5000...\n");// 3. 接收数据while (1) {int len = recvfrom(sockfd, buffer, sizeof(buffer), 0,(struct sockaddr*)&client_addr, &client_len);buffer[len] = '\0';printf("Received from %s:%d: %s\n",inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port), buffer);// 4. 回发消息sendto(sockfd, "Hello from UDP server", 22, 0,(struct sockaddr*)&client_addr, client_len);}close(sockfd);return 0;
}

✅ 客户端(udp_client.c)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>int main() {int sockfd;struct sockaddr_in server_addr;char buffer[1024];// 1. 创建UDP Socketsockfd = socket(AF_INET, SOCK_DGRAM, 0);// 2. 服务器信息server_addr.sin_family = AF_INET;server_addr.sin_port = htons(5000);inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr);// 3. 发送数据sendto(sockfd, "Hello UDP Server", 17, 0,(struct sockaddr*)&server_addr, sizeof(server_addr));// 4. 接收回应socklen_t addr_len = sizeof(server_addr);int len = recvfrom(sockfd, buffer, sizeof(buffer), 0,(struct sockaddr*)&server_addr, &addr_len);buffer[len] = '\0';printf("From server: %s\n", buffer);close(sockfd);return 0;
}

🧰 编译与运行

gcc udp_server.c -o udp_server
gcc udp_client.c -o udp_client
./udp_server
# 另一个终端运行客户端
./udp_client

⚙️ 四、UDP 常用函数讲解

函数名 功能 说明
socket() 创建Socket SOCK_DGRAM 表示UDP
bind() 绑定本地地址和端口 通常服务端使用
sendto() 向指定地址发送数据 无需建立连接
recvfrom() 接收数据并返回来源地址
close() 关闭Socket

🧮 五、UDP Socket 常用选项

1. 设置套接字参数

int opt = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

2. 常用选项表

选项名 说明 使用场景
SO_REUSEADDR 允许端口重用 避免重启时报错
SO_BROADCAST 允许广播发送 局域网广播
SO_RCVBUF / SO_SNDBUF 调整缓冲区大小 优化性能
IP_MULTICAST_TTL 组播跳数 多播场景

🌍 六、UDP 的三种通信模式

模式 特点 示例
单播(Unicast) 一对一通信 普通客户端和服务器
广播(Broadcast) 一对多通信 局域网内同时通知
组播(Multicast) 特定组通信 IPTV、视频会议

📡 七、UDP 与 TCP 的区别总结

特性 TCP UDP
连接方式 面向连接 无连接
可靠性 保证顺序与可靠性 不保证顺序或可靠性
传输单位 字节流 数据报
速度 较慢 快速
适用场景 文件传输、HTTP 实时通信、语音、视频、DNS

🔍 八、UDP 调试与测试命令

命令 功能
netstat -anu 查看UDP端口
ss -u -l 查看UDP监听
tcpdump -i eth0 udp 抓UDP包
nc -u 127.0.0.1 5000 使用 netcat 测试UDP服务

📈 九、UDP 实践建议

  1. 先从本地单播(127.0.0.1)开始练习。
  2. 再尝试广播(如 255.255.255.255)通信。
  3. 了解组播(Multicast)通信。
  4. 使用 tcpdump 观察 UDP 包的内容。
  5. 对比 TCP 程序,理解“无连接”带来的影响。

🧭 十、进阶学习方向

阶段 学习内容
初级 UDP 单播、广播编程
中级 组播、多播(Multicast)编程
高级 RTP、QUIC、实时音视频传输协议
专业 实现可靠UDP(RUDP)、应用层重传机制

📚 十一、参考资料

  • 《Unix 网络编程(卷1)》—— W. Richard Stevens

  • man 手册:

    man 2 socket
    man 2 sendto
    man 7 udp
    
  • Linux 内核头文件:/usr/include/linux/udp.h

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/946521.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用户上下文透传机制详解

RuoYi-Cloud 用户上下文透传机制详解 引言 在微服务架构中,用户上下文的传递是一个关键问题。当一个请求在多个微服务之间调用时,如何确保用户身份信息能够正确传递到每个服务中,是实现安全认证和权限控制的基础。R…

品牌故事不会写?这个AI指令可能帮你解决大问题

本文分享了一个专业的品牌故事生成AI指令,帮助创业者和品牌负责人解决品牌叙事难题。文章提供了基础版和进阶版两个完整指令模板,通过结构化的方式指导AI生成具有情感共鸣和传播价值的品牌故事。内容包含实际使用案例…

电梯调度编程结对项目总结

电梯调度编程结对项目总结 项目地址:https://gitee.com/surrealgit/elevator_surreal.git 一、项目背景 本次课程大作业要求我们以结对编程的形式,完成一个电梯调度算法系统,包括调度算法设计、可视化界面实现、模块…

GuessGame两个版本的区别

GuessGame 两个版本的区别分析目录GuessGame 两个版本的区别分析一、控制台输出二、图形界面2.1 抽象类的好处三、两者对比四、总结 一、控制台输出 控制台版本的ConsoleGame是最基础、最传统的程序交互方式,它通过标…

第二次作业--田佳吉

https://gitee.com/tian-jiaji/qunqing.git

电脑频繁卡顿?4个CMD命令揪出后台隐藏进程

电脑频繁卡顿?4个CMD命令揪出后台隐藏进程电脑频繁卡顿?4个CMD命令揪出后台隐藏进程 你以为电脑卡顿只是垃圾太多?警惕!70%的后台异常进程都藏着“数字内鬼”——可能是黑客植入的隐蔽程序,正偷偷上传你的代码、文…

Graphiti:为智能体构建实时知识图谱,引领更聪明的 AI 时代

我一直觉得很神奇:大多数 AI 系统只要你一停止和它们对话,就会把一切都忘光。你喂给它们 facts、context、chat logs——会话一结束,噗的一下,全没了。这一直是“intelligent” agents 的最大瓶颈。 后来我发现了 …

2025_软件工程师课程辅导

第一周 课程内容 核心教学内容 App Inventor入门实践 使用工具App Inventor网站:http://ai2.17coding.net/AI伴侣手机应用应用相关素材从百度网盘下载上述工具软件和应用素材,如下图所示:课程案例Hello,小蜜蜂!画…

初学Claude Skills/Agents/Plugins功能

初学Claude Skills/Agents/Plugins功能目录SkillsSkills 的关键特点Skills的结构建立不同的 Skills个人 Skills项目 Skills插件 Skills编写 SKILL创建SKILL.md 文件Skills 如何工作学习网址AgentsPlugins Anthropic 刚…

《《《es相关

es 修改思路 一:新建索引 1.新建立索引 addIndex 为ik_smart 二: es 查询 1.es分页是从0开始.分页开始页-1,和结束页-1 2.addIndex 为 ik_smart(分词没有那么细,一般情况可以用这个)每天多努力一点,你将会变得更…

人资新手必看,企业绩效的意义

绩效考核管理是牵引整个企业行动方向的关键 其意义在于: 一、是有利于人事决策,通过绩效考核识别核心人才,对其加以培训、委以重任,同时能够根据员工特长决定人员调配和升降。 二、是确定合理的薪酬水平。根据员工的…

初学Claude Skills Agents功能

初学Claude Skills Agents功能目录SkillsSkills 的关键特点Skills的结构建立不同的 Skills个人 Skills项目 Skills插件 Skills编写 SKILL创建SKILL.md 文件Skills 如何工作学习网址Agents Anthropic 刚刚为 Claude 推出…

题解:P14309 【MX-S8-T2】配对

前言:考场上看出来了某关键性质结果发现做不下去了,然后就寄了。最后因为代码全部加了文件操作荣获总分 0 分的优异成绩。这种题需要我们多加猜测性质并辅以证明。 性质 #1 我们先不考虑任何修改操作。 一个子树内的…

HuggingFace 库使用小技巧

有时在处理数据的时候,我们在数据处理函数内部添加调试语句但是却没有输出,这可能是因为:数据被缓存了,令overwrite_cache: true即可,这样就会重新调用数据处理函数处理数据(一般在调试的时候使用)

【ArcMap】复制选中的线并将其上移一段距离

首先选中需要复制的线 在python2窗口中输入以下代码:此处为上移10米对于地理坐标系,使用0.00009度(约10米)对于投影坐标系,使用10米# -*- coding: utf-8 -*- import arcpy import os import sys# 重新加载sys并设…

启动分布式mapreduce的过程以及prompt

打开docker desktop,启动5个节点 用VS Code连接到第一个节点 为每个节点打开SSH服务service ssh start 每个节点运行cd /usr/local/hadoop-3.4.0/sbin && ./stop-all.sh && rm -rf /usr/local/hadoop…

记一次thinkphp3.2项目迁移失败的原因。 is currently unable to handle this request. HTTP ERROR 500

项目迁移到别的服务器后报错如下 This page isn’t working xxxx is currently unable to handle this request. HTTP ERROR 500这个问题是关闭了错误显示,不能看到明显的错误 打开php.ini文件 display_errors = Off …

20232310 2025-2026-1 《网络与系统攻防技术》实验三实验报告

1.实验内容 1.1回答问题 (1)杀软是如何检测出恶意代码的? 将文件二进制代码与病毒库中的已知恶意特征对比,若匹配则判定为威胁。 分析代码结构和行为逻辑,例如检查是否调用危险API、是否存在异常注册表操作或加密…

题解:AT_apc001_h Generalized Insertion Sort

为数不多能瞎搓出来的构造。 题意:给出一棵以 \(0\) 为根的树和每个点上的值 \(a_i\),每次可以对一个点 \(u\) 进行以下操作:设从根往下走到 \(u\) 的路径为 \(p_1,p_2,\cdots p_k\),那么令 \(a_{p_i}\leftarrow a…

[SWPUCTF 2024 秋季新生赛]http标头 WP

[SWPUCTF 2024 秋季新生赛]http标头 WP 进入界面,会发现一个黑神话悟空,让我们在发布时间 \(0\) 时 \(0\) 分 \(0\) 秒。 我们打开 Burpsuite 抓包,拦截请求。按照他的要求,修改 Date。 Date:Tue, 20 Aug 2024 00:…