c++ - 如何在 Linux 上强制关闭套接字?

标签 c++ mysql c linux sockets

对于 THIS原因,我想尝试一些新的东西——使用一些系统调用关闭套接字。

两个词的情况 - 无法设置 mysql 库的查询超时(C API,有关更多信息,请参阅链接),所以我想尝试关闭套接字以查看库将如何 react 。可能这不是一个好主意,但还是想尝试一下。

这是我所做的 - 有另一个启动的线程 - 一个计时器。因此,在特定超时后(比如 10 秒),如果没有响应,我想关闭套接字。 MYSQL 结构有成员 net,它也是一个结构,并保存 fd。但是当我尝试这样做时:

shutdown( m_pOwner->m_ptrDBConnection->m_mysql.net.fd, SHUT_RDWR );
close( m_pOwner->m_ptrDBConnection->m_mysql.net.fd );

没有任何反应。 shutdownclose 的返回值为0,但socket 仍然打开(因为等待60 秒后,DB 返回了结果,这意味着 mysql 客户端仍在等待来自数据库的响应。

有什么想法吗?

谢谢

编辑 - 是的,有一个正在运行的事务,而我正在尝试关闭套接字。但这是实际问题 - 我无法终止查询,也无法关闭连接,什么都没有,而且我不想等待整个超时,即 20 分钟和 30 秒,或类似的时间。这就是为什么我要寻找蛮力.. :/

最佳答案

只是盲目尝试,但请务必取消/终止任何正在运行的交易。我不熟悉 MySQL C API,但我想有一种方法可以检查是否有任何事件的连接/查询。您可能无法关闭套接字只是因为仍然有东西在运行,并且需要将它们带到某种“已解决”状态,无论是提交还是回滚。我会从那里开始,看看会发生什么。如果你有任何未决的事情,你真的不想关闭套接字“蛮力”风格,因为你的数据之后不会处于可靠的“状态” - 你不会知道哪些交易成功,哪些交易没有,虽然我可以想象,如果连接突然失败,MySQL 会回滚任何未决事务。

编辑: 从我通过谷歌搜索“MySQL stopping runaway query”发现的内容来看,共识似乎是要求 MySQL 使用

终止失控/长时间运行的查询的线程
KILL thread-id

我想您可以在包含套接字的 MySQL 数据结构中使用线程 ID。您可能想试试这个,尽管 IIRC 这样做需要 super 用户权限。

编辑#2: 显然 MySQL 提供了一种故障安全机制,可以重新启动关闭的连接,因此强行关闭套接字实际上不会终止查询。一旦关闭它,MySQL 将打开另一个并尝试完成查询。关闭此功能将允许您关闭套接字并导致查询终止。

下面的评论显示了如何找到答案,以及其中涉及的思考过程。

关于c++ - 如何在 Linux 上强制关闭套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4461562/

相关文章:

C++ 仅当模板为字符串类型时才执行小写转换

acdbEntGet 和 acdbEntGetX 的 C# 包装器

c++ - 我释放内存两次 - C++

Mysql UPDATE query SET 来自另一个查询的结果

php - 使用 SWIG 创建 PHP C/C++ 扩展模块

c++ - 在没有其他库的情况下用纯 c/c++ 编写 BMP 图像

c++ - std::hex 无法处理负数?

php - 在 Laravel 中向注册表单添加字段不起作用

java - 在数据库中存储盐 - 字符还是二进制?

c - 蓝Z 5.43 : D-BUS gattlib ble_scan