网络编程epoll和udp

news2025/7/10 1:11:56

# epoll模型核心要点
## 1. epoll核心概念
### 1.1 高效IO多路复用
- 监视列表与激活列表分离
- 内核使用红黑树存储描述符
- 边缘触发模式(EPOLLET)支持
### 1.2 事件触发机制
- **水平触发(LT)**:
- 默认模式,类似select/poll
- 数据未读完持续触发事件
- **边缘触发(ET)**:
- 需手动设置EPOLLET标志
- 数据到达仅触发一次事件
- 必须搭配非阻塞IO使用
## 2. 关键操作函数
### 2.1 epoll_create1
```c
int epfd = epoll_create1(EPOLL_CLOEXEC);
  • 创建epoll实例
  • EPOLL_CLOEXEC标志自动关闭文件描述符

2.2 epoll_ctl

epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &event);
  • 操作类型:
    • EPOLL_CTL_ADD 添加描述符
    • EPOLL_CTL_MOD 修改事件
    • EPOLL_CTL_DEL 删除描述符
  • 事件结构体:
    struct epoll_event {
    uint32_t events; // EPOLLIN/EPOLLOUT/EPOLLERR
    epoll_data_t data; // 携带用户数据
    };

2.3 epoll_wait

int num = epoll_wait(epfd, events, maxevents, timeout);
  • 阻塞等待事件触发
  • 参数:
    • timeout=-1永久阻塞
    • timeout=0非阻塞
  • 返回激活事件数量

3. 服务器实现流程

3.1 初始化阶段

// 创建TCP套接字
int sfd = socket(AF_INET, SOCK_STREAM, 0);
// 绑定地址
bind(sfd, (struct sockaddr*)&addr, sizeof(addr));
// 设置监听队列
listen(sfd, 5);
// 创建epoll实例
int epfd = epoll_create1(EPOLL_CLOEXEC);

3.2 事件处理循环

  1. 接受新连接
int client_fd = accept(sfd, ...);
// 设置非阻塞模式
fcntl(client_fd, F_SETFL, O_NONBLOCK);
// 添加至epoll监视
epoll_ctl(epfd, EPOLL_CTL_ADD, client_fd, &event);
  1. 处理数据接收
while(recv() > 0) { // 边缘触发需循环读取
printf("Received: %s", buf);
if(errno == EAGAIN) break; // 非阻塞模式退出条件
}
  1. 异常处理
if(ret == 0) { // 客户端关闭
epoll_ctl(epfd, EPOLL_CTL_DEL, fd_temp, NULL);
close(fd_temp);
}

4. 模型对比

特性selectpollepoll
数据结构位图(1024限制)结构体数组红黑树
时间复杂度O(n)线性扫描O(n)线性扫描O(1)回调通知
触发模式仅水平触发仅水平触发支持边缘触发
内存拷贝每次全量复制每次全量复制增量操作
适用场景低并发/跨平台中等并发高并发/Linux专用

5. 客户端实现要点

5.1 非阻塞IO设置

int flags = fcntl(fd, F_GETFL);
fcntl(fd, F_SETFL, flags | O_NONBLOCK);

5.2 数据发送处理

while(1) {
fgets(buf, sizeof(buf), stdin);
send(sfd, buf, strlen(buf), 0); // 边缘触发需保证完全发送
if(errno == EAGAIN) usleep(1000); // 流量控制
}

6. 特殊场景处理

6.1 多客户端通信

  • 服务端维护客户端映射表
  • 使用epoll_data携带会话上下文
event.data.ptr = &client_ctx; // 传递自定义数据结构

6.2 心跳检测机制

  • 定时器队列管理连接状态
  • EPOLLERR事件处理异常断开

# UDP套接字通信核心要点
## 1. UDP协议特性
### 基础特征
- 无连接不可靠传输
- 数据报独立发送
- 支持数据顺序错乱
- 效率高延迟低
### 适用场景
- 实时音视频传输
- 在线游戏数据交互
- 广播/组播通信
## 2. 核心函数解析
### socket创建
```c
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
  • 协议族必须为AF_INET
  • 类型指定SOCK_DGRAM

数据接收

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);
  • 获取发送方地址信息
  • flags支持阻塞/非阻塞模式

数据发送

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
  • 必须指定目标地址
  • 单次发送上限4096字节

connect特殊用法

  • 内核预存目标地址信息
  • 允许使用send/recv简化调用
  • 可多次调用更改目标地址

3. 服务器实现流程

核心步骤

  1. 创建DGRAM类型套接字
  2. 绑定固定IP和端口
  3. 循环接收客户端消息
  4. 响应消息附加处理标识

关键代码段

struct sockaddr_in cliaddr;
socklen_t len = sizeof(cliaddr);
ret = recvfrom(sockfd, buf, sizeof(buf), 0,
(struct sockaddr*)&cliaddr, &len);
sendto(sockfd, modified_buf, strlen(modified_buf), 0,
(struct sockaddr*)&cliaddr, len);

4. 客户端实现模式

基础版本

  • 每次发送指定目标地址
  • 内核自动管理地址缓存

高效版本

connect(sockfd, (struct sockaddr*)&seraddr, sizeof(seraddr));
send(sockfd, buf, strlen(buf), 0);
  • 内核持续存储目标地址
  • 减少地址解析开销

5. 特殊处理机制

地址重置

struct sockaddr_in unspec = { .sin_family = AF_UNSPEC };
connect(sockfd, (struct sockaddr*)&unspec, sizeof(unspec));
  • 清除内核缓存的地址
  • 恢复原始发送模式

错误检测

  • recvfrom返回0表示空数据包
  • errno==EAGAIN时处理非阻塞状态
  • 发送失败需重试或记录日志

6. 与TCP对比差异

特性UDPTCP
连接方式无连接三次握手建立连接
数据边界保留报文边界字节流形式
可靠性不保证数据完整可靠传输
资源消耗
适用场景实时性要求高的场景数据完整性场景

7. 性能优化方向

  • 使用连接式UDP减少系统调用
  • 设置SO_RCVBUF/SO_SNDBUF
  • 采用非阻塞IO+epoll多路复用
  • 实现应用层重传机制

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

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

相关文章

【iOS】源码阅读(四)——isa与类关联的原理

文章目录 前言OC对象本质探索clang探索对象本质objc_setProperty源码探索 cls与类的关联原理为什么说bits与cls为互斥关系isa的类型isa_t原理探索isa与类的关联 总结 前言 本篇文章主要是笔者在学习和理解类与isa的关联关系时所写的笔记。 OC对象本质探索 在学习和理解类与isa…

uniapp 常用 UI 组件库

1. uView UI 特点: 组件丰富:提供覆盖按钮、表单、图标、表格、导航、图表等场景的内置组件。跨平台支持:兼容 App、H5、小程序等多端。高度可定制:支持主题定制,组件样式灵活。实用工具类:提供时间、数组操…

SCI写作开挂!把Grammarly语法修订嵌入word

详细分享如何把Grammarly嵌入Word,实现英文写作时的实时语法校改。 ①进入Grammarly官网 ②点击右上角的“Get Grammarly Its free”会直接跳转到注册或者登录界面,如果还没有账号先注册。 ③注册或登录后进入这个页面,点击“Support”。 ④…

2025年5月-信息系统项目管理师高级-软考高项-成本计算题

成本计算题挣值分析、成本计算题如何学?1、PV,EV,AC需要理解,根据题目给出的一些个条件需要求得这些值;2、CV,SV,CPI,SPI公式必须记住,需要根据求得的值判断项目的进度和成本的执行情况&#x…

SpringBoot中的Lombok库

一)Lombok库简介 Lombok是一个Java库,通过注解的方式简化代码编写,减少样板代码。它能够自动生成getter、setter、构造函数、toString等方法,提升开发效率。Lombok只是一个编译阶段的库,因此不会影响程序的运行。 二…

AI中的MCP是什么?MCP的作用及未来方向预测 (使用go-zero 快速搭建MCP服务器)

AI是当下最热的风。在当今AI技术飞速发展的时代,AI的应用已经渗透到我们日常生活的方方面面。然而,随着AI系统的复杂性不断增加,如何让AI具备更强的自主性和灵活性成为了业界关注的焦点。这就引出了Model Context Protocol(MCP&am…

mac安装cast

背景 pycharm本地运行脚本时提示cast没有安装 问题原因 脚本尝试调用cast命令(以太坊开发工具foundry中的子命令),但您的系统未安装该工具。 从日志可见,错误发生在通过sysutil.py执行shell命令时。 解决方案 方法1&#xf…

一个简单点的js的h5页面实现地铁快跑的小游戏

以下是一个简化版的"地铁快跑"小游戏H5页面实现。这个游戏包含基本的角色跳跃、障碍物生成和计分系统&#xff0c;使用Canvas绘图技术实现。 完整源码 登录后复制 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-…

Hugging Face 中 LeRobot 使用的入门指南

相关源文件 .github/ISSUE_TEMPLATE/bug-report.yml .github/PULL_REQUEST_TEMPLATE.md README.md examples/1_load_lerobot_dataset.py examples/2_evaluate_pretrained_policy.py examples/3_train_policy.py lerobot/scripts/eval.py lerobot/scripts/train.py 本页面提供 …

零基础入门Hadoop:IntelliJ IDEA远程连接服务器中Hadoop运行WordCount

今天我们来聊一聊大数据&#xff0c;作为一个Hadoop的新手&#xff0c;我也并不敢深入探讨复杂的底层原理。因此&#xff0c;这篇文章的重点更多是从实际操作和入门实践的角度出发&#xff0c;带领大家一起了解大数据应用的基本过程。我们将通过一个经典的案例——WordCounter&…

HTML-3.3 表格布局(学校官网简易布局实例)

本系列可作为前端学习系列的笔记&#xff0c;代码的运行环境是在HBuilder中&#xff0c;小编会将代码复制下来&#xff0c;大家复制下来就可以练习了&#xff0c;方便大家学习。 系列文章目录 HTML-1.1 文本字体样式-字体设置、分割线、段落标签、段内回车以及特殊符号 HTML…

遗传算法求解旅行商问题分析

目录 一、问题分析 二、实现步骤 1&#xff09;初始化种群 2&#xff09;计算适应度 3&#xff09;选择操作 4&#xff09;交叉操作 5&#xff09;变异操作 三、求解结果 四、总结 本文通过一个经典的旅行商问题&#xff0c;详细阐述在实际问题中如何运用遗传算法来进…

打造网络安全堡垒,企业如何应对DDoS、CC、XSS和ARP攻击

网站已经成为企业展示形象、开展业务和实现线上营销的重要平台。然而&#xff0c;随着网络攻击手段的不断升级&#xff0c;DDoS、CC、XSS、ARP等攻击频频出现&#xff0c;严重威胁到企业的信息安全和业务稳定。本文将详细阐述网站被攻击后应采取的应急措施及预防策略&#xff0…

深度解析物理机服务器故障修复时间:影响因素与优化策略

一、物理机故障修复的核心影响因素 物理机作为企业 IT 基础设施的核心载体&#xff0c;其故障修复效率直接关系到业务连续性。故障修复时间&#xff08;MTTR&#xff09;受多重因素交叉影响&#xff1a; 1. 故障类型的复杂性 硬件级故障&#xff1a; 简单故障&#xff1a;内存…

印度全印度游戏联合会(AIGF)介绍与用途

本文为印度AIGF的介绍科普文&#xff0c;自去年开始&#xff0c;印度Rummy类游戏申请印度支付都需要拥有AIGF的会员及产品证书。 如需要rummy可以通过AIGF审核的源。码&#xff0c;或咨询AIGF的相关内容&#xff0c;可以联。系老妙。 全印度游戏联合会&#xff08;All India G…

可视化数据图表怎么做?如何实现三维数据可视化?

目录 一、三维数据可视化的要点 1. 明确数据可视化的目标 2. 筛选与整理数据 3. 选择合适的图表类型 4. 运用专业工具制作 5. 优化图表的展示效果 二、数据可视化图表怎么做&#xff1f; 1. 理解三维数据的特性 2. 数据处理与三维建模 3. 设置光照与材质效果 4. 添加…

视频分辨率增强与自动补帧

一、视频分辨率增强 1.传统分辨率增强方法 传统的视频分辨率增强方法主要基于插值技术。这些方法通过对低分辨率视频帧中已知像素点的分布规律和相邻像素之间的相关性进行分析&#xff0c;在两者之间插入新的像素点以达到增加视频分辨率的目的。例如&#xff0c;最近邻插值算…

【SPIN】用Promela验证顺序程序:从断言到SPIN实战(SPIN学习系列--2)

你写了一段自认为“天衣无缝”的程序&#xff0c;但如何确保它真的没有bug&#xff1f;靠手动测试&#xff1f;可能漏掉边界情况&#xff1b;靠直觉&#xff1f;更不靠谱&#xff01;这时候&#xff0c;Promela SPIN组合就像程序的“显微镜”——用形式化验证技术&#xff0c;…

降本增效双突破:Profinet转Modbus TCP助力包布机产能与稳定性双提升

在现代工业自动化领域&#xff0c;ModbusTCP和Profinet是两种常见的通讯协议。它们在数据传输、设备控制等方面有着重要作用。然而&#xff0c;由于这两种协议的工作原理和应用环境存在差异&#xff0c;直接互联往往会出现兼容性问题。此时&#xff0c;就需要一种能够实现Profi…

JESD204 ip核使用与例程分析(一)

JESD204 ip核使用与例程分析(一) JESD204理解JESD204 与JESD204 PHY成对使用原因JESD204B IP核JESD204B IP核特点JESD204B IP核配置第一页第二页第三页第四页JESD204 PHY IP核配置第一页第二页JESD204理解 JESD204B是一种针对ADC、DAC设计的传输接口协议。此协议包含四层, …