本地 UDP socket sendto 阻塞

2021-02-10 10:19:29 +08:00
 SilverLink

小弟最近需要处理一个 bug,没有思路,想咨询下大家

问题可以抽象为:同一 Linux 主机的两个进程,使用 AF LOCAL 的 UDP socket 互相发送消息,但是发送快到一定程度几 s 后,两个进程就都会卡住,重启 A 后工作正常。

根据日志和定位,情况是进程 A 执行到 sendto 后卡住,B 如果准备向 A 发消息,就也会在 sendto 函数里出不来,然后串口就安静了。

看起来很像是两个进程的缓冲区都满了,同时等待对方接收,形成死锁。但是我记得 UDP 没有发缓冲区,如果接收方的收缓冲区满了,发送方应该也不会管,而是任接收方丢弃,为什么会陷在函数里出不来呢?

有没有一些查找问题根源的思路

1672 次点击
所在节点    程序员
4 条回复
XiaoxiaoPu
2021-02-10 10:36:06 +08:00
AF_UNIX ( AF_LOCAL ) SOCK_DGRAM 并不是 UDP,它是可靠的。
undef404
2021-02-10 10:36:27 +08:00
udp send 有缓冲的.
可以改成 non_block 模式, 如果 buffer 满了就先别发.
back0893
2021-02-10 13:41:36 +08:00
emm
udp 不是缓存满了就自动丢弃么
Meltdown
2021-02-10 16:03:05 +08:00
到底是 UDP 还是 UNIX 域套接字

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/752764

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX