【问题标题】:PHP force close (kill) a connectionPHP 强制关闭(杀死)连接
【发布时间】:2012-02-19 15:40:15
【问题描述】:

我使用套接字(使用fsockopen()stream_socket_client())和cURL 来强制关闭连接(TCP/HTTP)进行了一些测试。但是,没有运气。

无论我使用 1 毫秒超时(在 cURL 上,CURLOPT_TIMEOUT_MS 选项至少需要 1 秒)还是在禁用阻塞的情况下打开连接后立即退出连接,它仍然可以完美运行。

我没有尝试 fork (pcntl_fork()) 我的脚本,但我的服务器仍然不支持它。

有没有其他方法可以在 PHP 中终止连接?在 C# 中却不能在 PHP 中使用,这很令人失望:(


编辑:让我澄清一下我的问题,因为它可能有点令人困惑:

我想看看 PHP 是否允许开发人员发送 SYN。就这样。一个使用 PHP 原生函数的单个 SYN 数据包。

【问题讨论】:

  • 这不就是fclose()socket_close()curl_close()的用途吗?
  • @MetalFrog 不,此时已经发送了 SYN、SYN-ACK 和 ACK。这不是强制关闭或杀死,而是正常关闭连接。

标签: php sockets curl kill


【解决方案1】:

这似乎与另一个有关通过 PHP 发送原始、低级数据的 Stack Overflow 问题有关:Want to manually send SYN ACK packets to establish TCP connection (in PHP if possible)

答案中提到的库是prnl,它可以完成这项工作,但我还没有玩太多。来自描述:

PRNL 是一个 PHP 库,旨在执行低级网络任务。在第一个版本中,我们从发送和接收原始 IP 数据包的可能性开始。使用 PRNL,您可以创建和传输具有匹配 TCP 和 UDP 数据包的自定义 IP 数据包。

如果您通过 Apache 使用 PHP,那么您会发现 Apache 在您的 PHP 有机会运行之前已经建立了连接。我现在不确定你是否有能力在那个时候干预握手。

如果这不是您要找的内容,请更新问题,我会看看我能找到什么来为您提供所需的内容。

【讨论】:

  • 在这种情况下,PHP 与 Apache 无关。此外,PRNL 仅从命令行运行,因此与 Web 应用程序无关。最后,您没有足够的权限在 Mac 或 Windows 上创建这些套接字。如果你幸运的话,你可以在 Linux 上...
  • 你没有说你是在应用程序中尝试这个还是仅仅作为概念证明。至于 PRNL,您应该能够根据需要从您的代码中调用/实例化其对象,而不仅仅是命令行访问。你在什么服务器环境上运行?
  • OSX 10.6.8 和我懒安装了 MAMP 服务器。这似乎是一个完美的解决方案,我绝对愿意使用它,但我不断收到此错误:Unable to create socket [1]: Operation not permitted。会不会是MAMP?那会很愚蠢..非常感谢您到目前为止和提前的支持
【解决方案2】:

你试过socket_close吗?

或者exit()脚本如果应该立即关闭连接。

【讨论】:

  • 我都试过了,都还是正常关闭了连接。
猜你喜欢
  • 2012-11-03
  • 2020-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多