uv_close((uv_handle_t*)client,NULL)当我尝试使用库中的函数libuv主动关闭与客户端的TCP连接时,出现错误
“主要:src/unix/core.c:117:uv_close:断言‘!uv__is_ opening(handle)’失败。”
已经报道。我在网上搜索了很多,但仍然找不到解决问题的正确方法。我希望有人能告诉我为什么会出现这个问题以及如何解决它。
您正在尝试关闭已关闭或处于关闭状态的句柄(即,在使句柄从活动状态变为关闭状态的过程中的某个位置)。
从 的代码中可以看出libuv,该uv_close函数的开头为:
void uv_close(uv_handle_t* handle, uv_close_cb close_cb) {
assert(!uv__is_closing(handle));
handle->flags |= UV_CLOSING;
// ...
Run Code Online (Sandbox Code Playgroud)
其中uv__is_closing定义为:
#define uv__is_closing(h) \
(((h)->flags & (UV_CLOSING | UV_CLOSED)) != 0)
Run Code Online (Sandbox Code Playgroud)
总而言之,一旦uv_close在句柄上调用,UV_CLOSING就会设置该标志,并在后续调用中对其进行检查,以避免多次运行 close 函数。换句话说,您只能关闭句柄一次。
出现错误是因为您可能uv_close多次调用句柄。然而,如果不看真正的代码就很难说。
附带说明一下,uv_is_closing如果您有疑问,可以用来测试您的手柄。这是 的一种别名uv__is_closing。