当我尝试使用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/