96SEO 2026-06-16 02:54 0
嘿,老铁,今天咱们聊聊《第三章如何解读Fast‑DDS源码及流程分析?》这玩意儿。
先说说源码结构,别装逼啦Fast‑DDS的源码啊,像一盘散沙的拼图。

你打开 src/cpp/rtps/ 那层目录,基本上Nengkan到四大块:Discovery、Transport、History、QoS。
我Zui爱先把 PDP.cpp 和 EDP.cpp 给挑出来顺手敲点断点。
# 启动gdb
gdb ./examples/cpp/hello_world/hello_world
# 设置断点:Participant创建
break eprosima::fastdds::dds::DomainParticipantFactory::create_participant
# 设置断点:PDP发送发现消息
break eprosima::fastrtps::rtps::PDP::announce_participant_state
# 设置断点:EDP匹配Writer和Reader
break eprosima::fastrtps::rtps::EDP::pairing_writer_reader
run
哎呀,不对不对,这里其实还有个小技巧——条件断点。
比如只在 domain_id 为 0 的时候停下来:
break eprosima::fastdds::dds::DomainParticipantFactory::create_participant if domain_id == 0
Discovery到底干啥子?
先说说 Discovery。它负责把节点信息广播出去,然后把对应的 Writer‑Reader 配对。
代码里 PDPListener.cpp 那块儿会把新来的 Participant 加进缓存;EDP.cpp 则负责 Endpoint 匹配。
想kan它们的执行流?直接在 PDPListener::on_new_cache_change_added 上打断点,跑一遍,你会kan到类似下面的日志:
New participant discovered: GUID=... DomainId=1
Matching writer GUID=... with reader GUID=...
传输层大揭秘——SHM 零拷贝
好玩儿的来了Shared Memory是 Fast‑DDS 的黑科技之一。
它通过 mmap 把内存段映射到进程空间,实现了“全程无系统调用”的零拷贝路径。
想验证一下?用 strace kan下调用栈:
strace -f -e trace=openat,mmap,munmap ./examples/cpp/hello_world/hello_world 2>&1 | grep -E "shm|/dev/shm"
# 期待输出:
openat = 5
ftruncate = 0
mmap = 0x7f1234567000
注意,没有 sendto / recvfrom 的痕迹,这就说明数据根本没走网络,是直接在用户态拷贝的。
Reliable到底怎么保证不丢包?这个机制可是 Fast‑DDS 的核心之一——Heartbeat + ACK/NACK + 重传。
代码里主要是 StatefulWriter.cpp 和 StatefulReader.cpp 配合工作。
下面给你一个简化版的时序图,用 Mermaid 写的:
sequenceDiagram
participant W as DataWriter
participant H as HeartbeatTimer
participant N as Network
participant A as ACK/NACK
participant R as DataReader
W->N: DATA
W->H: start timer
alt Reader收到数据
N->R: DATA
R->A: ACK
A->W: ACK received → remove from History
else 丢包了…
H->R: Heartbeat
R->A: NACK
A->W: request retransmit
W->N: resend DATA
end
Ru果你想观察这些细节,只要在下面几个函数上下断点就行:
StatefulWriter::send_heartbeat
StatefulWriter::process_acknack
StatefulWriter::resend_data
StatusManagerImpl::on_liveliness_changed
"为啥我写的 Fast‑DDS 教程百度搜索不到啊?"
哈哈,这事儿常见。主要原因有两点:
Noindex 标签或 robots.txt 禁止爬虫:b站或者个人博客Ru果加了 ,搜索引擎根本不抓。
Lack of inbound links:a站外链太少,权重低,自然排名也跟不上。
解决办法嘛,就是给页面加上 SEO 元信息,并且多发布到技术社区,让geng多人链接回来。你懂的,内容好自然会被抓取啦~
Liveliness 检测,你懂不懂?Liveliness 就是告诉别人:“我还活着”。在 Fast‑DDS 里它分两种模式:AUTOMATIC 和 MANUAL_BY_TOPIC。
AUTOMATIC 模式下每次写数据dou会自动 assert liveliness;手动模式则需要你自己调用 LivelinessManager::assert_liveliness.
sequenceDiagram
participant App as Application
participant LM as LivelinessManager
App->LM: assert_liveliness
LM->Timer: reset lease timer
loop Timer expires?
Timer-->LM: timeout?
alt not timeout
LM-->Timer: keep alive
else timeout
LM-->App: on_liveliness_lost
end
end
If you want to watch it in gdb:
break eprosima::fastrtps::rtps::LivelinessManager::assert_liveliness # 手动触发活性
break eprosima::fastrtps::rtps::LivelinessManager::callback # 超时回调
run
continue
print lease_duration
bt
Dive into DataSharing——零拷贝再升级版!🚀
Aha,这玩意儿比普通 SHM geng高级。它利用共享内存池和引用计数,让同机多个 Reader Neng共享同一块数据而不复制。
Main classes:
WriterPool.hpp / WriterPool.cpp: 管理写端缓冲区。
ReaderPool.hpp: 为读端提供指针池。
DataSharingNotification.cpp:) 用来通知 Reader 有新数据到达。
DataWriter* dw = ...; auto payload = dw->get_payload_pool->get_payload; memcpy, my_buf, size); dw->write;
Shoot! 那么调试时Ke以这么干:
# 在 WriterPool 创建新 payload 时停下来
break eprosima::fastrtps::rtps::DataSharingPayloadPool::get_payload
# 在通知 Reader 时停下来
break eprosima::fastrtps::rtps::DataSharingNotification::notify
run
continue
print payload->length
bt
Diving into Fragmentation—大文件怎么传?📦
If your message> max_message_size ,Fast‑DDS 会自动分片。
The relevant code lives in /src/cpp/rtps/messages/RTPSMessageGroup.cpp, function Add_data_frag.
The reassembly side is in /src/cpp/rtps/reader/FragmentedChangePitStop.cpp/hpp.
void RTPSMessageGroup:: adddatafrag(const CacheChanget* change, uint32t fragmentnumber, uint32t fragmentsnumber) { // ... build DATAFRAG submessage ... }// 重组示例: bool FragmentedChangePitStop:: process(const SubmessageHeader* hdr, const uint8_t* data) { // 缓存 fragment 并检查是否完整... }
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback