# rudp **Repository Path**: tjopenlab/rudp ## Basic Information - **Project Name**: rudp - **Description**: https://github.com/cloudwu/rudp Reliable UDP - **Primary Language**: C - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-04-01 - **Last Updated**: 2025-04-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # RUDP (Reliable UDP) 版本来源:https://github.com/cloudwu/rudp ## 1 使用说明 ### 1.1 单文件模式 ```sh make rudp ./rudp ``` ### 1.2 C-S 模式 引入了UDP通信(C-S)。构建server和client: ```sh make cs ``` 分别在不同终端运行server和client: ```sh ./server ./client ``` ## 2 介绍 ### 2.1 总体介绍 收到数据后,通过`RudpUpdate`更新到队列; 想从队列里取,调用`RudpRecv`,发送数据调用`RudpSend`; 调用`RudpUpdate`会返回需要重发的数据包,所以如果返回值不是`NULL`,就把这些数据包再发出去。 ### 2.2 消息复用`free_list` `free_list` 的作用是管理已释放的消息节点,以便复用。具体来说: 当一个消息被处理完毕后,不会立即释放其内存,而是将其添加到 `free_list` 中。当需要创建新消息时,首先会尝试从 `free_list` 中获取一个已有的节点进行复用,而不是每次都分配新的内存。这样可以减少频繁的内存分配和释放操作,提高性能并减少内存碎片。 ### 2.3 请求重发`request_missing` 假设我们有一个RUDP实例 `U`,它维护了一个接收队列 `recv_queue`,队列中的每个消息都有一个唯一的ID。`recv_id_min` 是当前期望接收到的最小消息ID。`request_missing` 函数的目的是检查接收队列中是否存在缺失的消息ID,并请求这些缺失的消息。示例如下: 假设 `U->recv_id_min` 为 10,接收队列 `recv_queue` 中的消息如下: - 消息1: ID = 10 - 消息2: ID = 12 - 消息3: ID = 14 执行过程如下: 1. **初始化**: - `id` 初始化为 `U->recv_id_min`,即 10。 - `m` 初始化为 `recv_queue.head`,即指向消息1 (ID = 10)。 2. **遍历接收队列**: - **第一次循环**: - 当前消息 `m` 的ID为 10,与 `id` 相等,继续。 - 更新 `id` 为 `m->id + 1`,即 11。 - 移动到下一个消息 `m->next`,即消息2 (ID = 12)。 - **第二次循环**: - 当前消息 `m` 的ID为 12,大于 `id` (11),说明存在缺失的消息ID 11。 - 进入内层循环,构造并发送请求消息,请求ID为 11 的消息。 - 更新 `id` 为 `m->id + 1`,即 13。 - 移动到下一个消息 `m->next`,即消息3 (ID = 14)。 - **第三次循环**: - 当前消息 `m` 的ID为 14,大于 `id` (13),说明存在缺失的消息ID 13。 - 进入内层循环,构造并发送请求消息,请求ID为 13 的消息。 - 更新 `id` 为 `m->id + 1`,即 15。 - 移动到下一个消息 `m->next`,此时 `m` 为 `NULL`,结束循环。 3. **返回结果**: - 如果所有缺失消息的请求都成功发送,则返回 `true`。 - 如果在构造请求消息时失败,则返回 `false`。 通过上述过程,`request_missing` 函数能够检测出接收队列中缺失的消息ID,并请求这些缺失的消息,确保接收队列中的消息ID连续。