V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
SilverLink
V2EX  ›  程序员

本地 UDP socket sendto 阻塞

  •  
  •   SilverLink · 2021-02-10 10:19:29 +08:00 · 1816 次点击
    这是一个创建于 1369 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

    4 条回复    2021-02-10 16:03:05 +08:00
    XiaoxiaoPu
        1
    XiaoxiaoPu  
       2021-02-10 10:36:06 +08:00
    AF_UNIX ( AF_LOCAL ) SOCK_DGRAM 并不是 UDP,它是可靠的。
    undef404
        2
    undef404  
       2021-02-10 10:36:27 +08:00
    udp send 有缓冲的.
    可以改成 non_block 模式, 如果 buffer 满了就先别发.
    back0893
        3
    back0893  
       2021-02-10 13:41:36 +08:00 via iPhone
    emm
    udp 不是缓存满了就自动丢弃么
    Meltdown
        4
    Meltdown  
       2021-02-10 16:03:05 +08:00 via Android
    到底是 UDP 还是 UNIX 域套接字
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2649 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 11:03 · PVG 19:03 · LAX 03:03 · JFK 06:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.