【问题标题】:How to force closing socket on Linux?如何在 Linux 上强制关闭套接字?
【发布时间】:2011-05-26 13:59:34
【问题描述】:

出于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 );

什么都没有发生。 shutdown和close的返回值是0,但是socket仍然是打开的(因为等待60秒后,DB有返回结果,也就是说mysql客户端还在等待DB的响应.

有什么想法吗?

谢谢

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

【问题讨论】:

  • 你确定那是正确的插座吗?
  • 我想是这样 - fd 是正确的 FD,它会根据打开的文件而改变。此外,这是唯一可以在 MySQL 对象(实际上是结构)中保存 FD 的字段。
  • @Nikolai - 有没有办法查看哪个套接字对应于哪个端口号,以 100% 确定这是正确的套接字? (OS-RHEL4)
  • 搜索lsof。您可能需要安装它。
  • 对不起netstat,还需要更多咖啡:),试试lsof。

标签: c++ mysql c linux sockets


【解决方案1】:

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

编辑: 从我通过谷歌搜索“MySQL 停止失控查询”发现的内容来看,共识似乎是要求 MySQL 使用

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

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

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

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

【讨论】:

  • 我完全同意你关于蛮力的看法,但我仍然想尝试一下。解释原因太长了。是的 - 有一个正在运行的交易,这就是我想要做的 - 以某种方式取消它。我尝试了很多方法 - 没有任何帮助。这就是我达到这种状态的原因,我想尝试强制关闭套接字。
  • 你是否知道当你去关闭套接字时是哪个事务,例如,你是否有一个指向该事务的句柄/指针,或者仅仅是一个处于活动状态而你没有办法参考它?
  • 我有一个指向准备好的查询的指针,并在上面调用Execute。如果这就是你的意思。
  • 可能想看看stackoverflow.com/questions/2065396/… ...文章提到java而不是C,但是SQL命令是一样的。
  • 非常酷......实际上会编辑这个答案。很高兴我能帮上忙。
【解决方案2】:

您似乎遇到了 TCP 等待计时器的问题,这意味着它最终会关闭。 [长话短说]这是不可避免的。对此进行了另一次讨论。

close vs shutdown socket?

【讨论】:

    【解决方案3】:

    据我所知,如果 shutdown() 和 close() 都返回 0,那么毫无疑问您已经成功关闭了一个套接字。事实是您可能关闭了错误的 fd。或者服务器无法对正确的关闭做出正确反应(如果是这样,这可能被认为是服务器的错误:没有理由仍然等待数据传入)。我会继续寻找一种支持的方式来做到这一点。

    【讨论】:

    • 是的,根据手册页,shutdown 和 close 都在成功时返回 0。我同意,可以说,支持的方式比尝试简单地拔掉插座上的插头更好。
    • 我一直在寻找这种“支持”的方式,但一无所获:/
    猜你喜欢
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多