DNS查询lookupdns程序分析-上—StateThreads示例程序介绍

lookupdns 是 StateThreads 官网提供的一个示例程序,用协程来并发查询 多个域名 IP 信息,用法如下:

复制代码
lookupdns srs.xianwaizhiyin.net ffmpeg.xianwaizhiyin.net

lookupdns 的调试环境搭建请阅读《StateThreads调试环境搭建》

lookupdns 程序主要由两个文件组成 lookupdns .c 跟 res.c,整体的函数流程如下:

上图查询了两个域名的 dns 信息,由于使用了协程,所以两个 dns 请求几乎是同一时间发出去的,我们可以用 tcpdump + wireshark 抓包看看,命令如下:

复制代码
sudo tcpdump port 53 -w dns_st.pcap

提示:dns 协议用的默认端口是 53,dns.pcap 可在 GitHub 上进行下载。

从上图可以看出,不是先查询完 srs.xianwaizhiyin.net 再查 ffmpeg.xianwaizhiyin.net 的,而是一起发出查询。从 9.35 ~ 9.40,查询两次 dns 一共花了 0.05 秒。

如果我们修改一下代码,不使用协程,看看整个通信过程是怎样的,代码如下:

tcpdump 抓包如下:

复制代码
sudo tcpdump port 53 -w dns_notst.pcap

dns.pcap 可在 GitHub 上进行下载。

可以看到,如果不使用协程,需要等到 srs.xianwaizhiyin.net 的查询结果返回,才能再发出第二个请求。从0 ~ 0.07,查询两次 dns 一共花了 0.07 秒,比使用协程慢了一点。

这就是协程的魅力。


虽然 lookupdns 程序开了 2 个协程,但是他整个进程还是只有 1 个线程的。多个协程是占用一个线程里面的时间片的。单个协程占用的内存是低于单个线程的,而且协程切换的上下文消耗会少一些。

上下文切换其实也是执行的一段汇编指令/机器码,假设 从协程A 切换到 协程B 需要执行 10 条汇编指令,而 从 线程A 切换到 线程B 需要执行 20 条汇编指令,那就可以说,线程切换的消耗比协程切换高一倍。


那是不是只有必须用 StateThreads 协程才能实现上面这种单线程并发查询 dns 的效果呢?

其实不是,还有另一种方法,就是自己调用 epoll 来实现这个功能,伪代码如下;

scss 复制代码
int socket_fd1 = socket(PF_INET, SOCK_DGRAM, 0)
int socket_fd2 = socket(PF_INET, SOCK_DGRAM, 0)

sendto(socket_fd2,www.baidu.net)
sendto(socket_fd1,www.xianwaizhiyin.net)

//监听两个 fd 的变化
epoll(socket_fd1,socket_fd2)

//变化到了,循环调 recvform()
recvform(socket_fdx)

但是这样把 request (请求) 跟 response (回调) 分离了,代码看起来不是特别优雅。但是可能上面的做法性能会更高一些的,因为上面的伪代码没有使用到协程功能,不需要切换协程来执行两次 sendto。

上面的两次 sendto 中间是没有任何东西的。是连续调用的。

StateThreads 协程的底层也用了 epoll ,这个我们后面会讲到。


现在我们已经基本了解了 协程的好处,下面让我们继续学习 lookupdns 程序的并发原理,请看《lookupdns程序分析-下》


本文是《 SRS原理 》一书中的文章,如需观看更多内容,请购买本书。

相关推荐
音视频牛哥4 天前
人形机器人的未来发展趋势是什么?从VLA、实时视觉到规模化运营
机器学习·机器人·音视频开发
霍营_托尼4 天前
纯前端播 40GB 本地视频?我把浏览器改造成了「磁盘流式」播放器
前端·javascript·音视频开发
花椒技术16 天前
2.46 秒生成 5 秒视频:拆解 H3 Max 的模型、推理栈与硬件协同
算法·音视频开发·视频编码
代码小学僧23 天前
从 0 到 1,记录我的第一个出海 SaaS 独立开发项目
前端·rpc·音视频开发
贾伟康24 天前
【HarmonyOS 7新能力|041】弱网直播优化工程封装:把接入逻辑放进可维护的分层结构
性能优化·harmonyos·arkts·音视频开发·直播
用户380341658829725 天前
Broadcast Extension 里的 Live Activity:一次跨进程妥协
ios·音视频开发
用户38034165882971 个月前
macOS 录屏:ScreenCaptureKit 与 iOS 的分野,共用引擎的抽象层该切在哪
ios·音视频开发
用户38034165882971 个月前
FFmpeg 在 iOS 上的裁剪、集成与包体控制
ios·音视频开发
花椒技术1 个月前
把 AI 视频接进直播:提前生成、按次生成、持续生成怎么选?
agent·音视频开发
老孙讲技术1 个月前
把连锁门店轮询抓拍和遮挡叫醒接进督导台-setDeviceSnapEnhanced与setMessageCallback
后端·物联网·音视频开发