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

时间:2010-12-16 14:05:42

标签: c++ mysql c linux sockets

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

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

这就是我所做的 - 还有另一个启动的线程 - 一个计时器。因此,在特定超时(假设为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,但套接字仍然打开(因为等待60秒后,DB返回结果,这意味着mysql客户端仍然是等待DB的响应。

有什么想法吗?

由于

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

3 个答案:

答案 0 :(得分:1)

只是在黑暗中拍摄,但请确保取消/终止任何正在运行的交易。我不熟悉MySQL C API,但我想有一种方法可以检查是否存在任何活动的连接/查询。您可能无法仅仅因为仍有事情正在运行而关闭套接字,并且需要将它们置于某种“已解决”状态,无论是已提交还是已回滚。我会从那里开始看看会发生什么。你真的不想关闭套接字“暴力”风格,如果你还有任何待处理的东西,因为你的数据之后不会处于可靠的“状态” - 你不会知道哪些交易成功,哪些没有,尽管我可以想象,如果连接突然失败,MySQL会回滚任何挂起的事务。

修改: 从我通过谷歌搜索“MySQL停止失控查询”发现,共识似乎是要求MySQL使用

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

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

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

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

答案 1 :(得分:0)

看起来你遇到了TCP等待计时器的问题,这意味着它最终会关闭。 [长话短说]这有点不可避免。还有另外一个讨论。

close vs shutdown socket?

答案 2 :(得分:0)

据我所知,如果shutdown()close()都返回0,毫无疑问你已经成功关闭了套接字。事实是你可以关闭错误的f​​d。或者服务器无法正确关闭(如果是这样,这可能被视为服务器的错误:没有理由仍然等待数据传入)。我一直在寻找支持的方式来做到这一点。