当我尝试使用uv_close((uv_handle_t*)client,NULL)库中的函数libuv主动关闭与客户端的TCP连接时,出现错误



已经报道。我在网上进行了大量搜索,但是仍然找不到解决问题的正确方法。我希望有人能告诉我为什么会导致这个问题以及如何解决。

最佳答案

您正在尝试关闭已经关闭或处于关闭状态的句柄(也就是说,在该过程中某个使句柄从 Activity 状态变为关闭状态的位置)。

libuv的代码中可以看到,uv_close函数的开始为:

void uv_close(uv_handle_t* handle, uv_close_cb close_cb) {
  assert(!uv__is_closing(handle));

  handle->flags |= UV_CLOSING;

  // ...

其中uv__is_closing定义为:
#define uv__is_closing(h)                                                     \
  (((h)->flags & (UV_CLOSING |  UV_CLOSED)) != 0)

总而言之,在句柄上调用uv_close时,就会立即设置UV_CLOSING标志,并在后续调用中对其进行检查,以避免多次运行close函数。换句话说,您只能关闭一次手柄。

出现错误是因为您可能多次调用句柄uv_close。但是,不看实际代码就很难说。

附带说明,如果有疑问,可以使用uv_is_closing测试句柄。这是uv__is_closing的别名。

关于c++ - main:src/unix/core.c:117:uv_close:断言 `!uv__is_closing(handle)'失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47522854/

10-10 21:24