libuv - 如何测试从客户端断开侦听套接字(中继应用程序)

时间:2016-02-01 07:21:54

标签: c libuv unix-socket

我的应用程序偶尔会修改并将收到的消息转发给侦听器服务器守护程序(所有这些都使用unix域套接字,所以uv_pipe_t)。

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

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

    • 设计中继应用程序的最佳方式是什么?也许不是,因为在重新连接时丢弃消息不是很有弹性,而且我不想在没有确保我遵循使用libuv的正确做法的情况下解决这个问题
    • 如果是,是否有以下任何选项值得?
      • 某些定期计时器设置与同伴的心跳
      • 一个uv_check句柄,它以某种方式在每次循环迭代时检查连接状态。如果是,如何检查连接状态?即使在连接的套接字上,uv_is_writeable也始终返回0。与uv_is_active相同
      • 来自on_connect回调函数的
      • uv_try_write()发送第一条被丢弃的消息
  3. 非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您可以在致电uv_write后致电uv_pipe_connect,并且写入将排队。连接成功后将进行写入,如果连接失败,则会以UV_ECANCELED失败。