gpt4 book ai didi

c - libuv - 如何测试监听套接字与客户端的断开连接(中继应用程序)

转载 作者:行者123 更新时间:2023-11-30 17:05:43 73 4
gpt4 key购买 nike

我的应用程序偶尔会修改收到的消息并将其转发到监听器服务器守护进程(全部使用 unix 域套接字,因此 uv_pipe_t)。

  1. (让我难住的工作流程)当必须中继第一条消息时,它会在 uv_read_done 回调函数中创建 uv_try_write() (它在自己的监听套接字上读取)

    • 如果监听守护进程已启动并正在运行,那就完美了,消息将被中继
    • 如果监听守护进程尚未启动
      • uv_try_write 失败,我检查状态为 -ve (EAGAIN),因此我尝试连接 (uv_pipe_connect)。之后我再次 uv_try_write() 。
      • 由于连接失败(ENOENT,我记录错误并放弃。)
    • 我现在启动监听守护进程
      • 尽管使用了 connect(),uv_try_write 在第一条消息上再次失败(因为我认为它在下一个循环迭代中进行连接)
      • 第二次写入工作正常且符合预期
    • 我杀死监听守护进程
      • 在接下来的写入中,应用程序收到 SIGPIPE 错误(我已使用 sigaction 和 sigprocmask 阻止了此错误)
    • 我重新启动监听守护进程
      • 这次 connect() 因 EISCONN 错误而失败(我认为这意味着我在第一个连接中使用的句柄仍然有效,需要关闭。但是,因为我无法检测到连接何时关闭上次监听守护进程,我不知道什么时候关闭句柄。
  2. 有关最佳实践的问题

    • 这是设计中继应用程序的最佳方式吗?也许不是,因为它在重新连接时丢弃消息的弹性不是很强,而且我不想在没有确保我遵循使用 libuv 的正确做法的情况下对此进行修改
    • 如果是,以下选项是否值得?
      • 一些定期定时器设置与对等点的心跳
      • 一个 uv_check 句柄,它以某种方式在每次循环迭代时检查连接状态。如果是这样,如何检查连接状态? uv_is_writeable 始终返回 0,即使在已连接的套接字上也是如此。与 uv_is_active 相同
      • 来自 on_connect 回调函数的 uv_try_write() 用于发送第一条被丢弃的消息

预先非常感谢您的帮助!

最佳答案

您可以在调用uv_pipe_connect之后调用uv_write,写入将会排队。连接成功后将进行写入,如果连接失败,则会失败并显示 UV_ECANCELED

关于c - libuv - 如何测试监听套接字与客户端的断开连接(中继应用程序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35124962/

73 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com