加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

如何知道PHP中的对等点何时重置连接?

发布时间:2020-12-13 13:16:14 所属栏目:PHP教程 来源:网络整理
导读:我最近一直在使用 PHP构建TCP服务器(我知道错误的选择,但这是工作标准),所以我已经达到了一个可靠的原型来对它进行测试并且它显示了良好的结果.在开始时我使用套接字函数来处理服务器的连接并且它工作正常,但项目的主要内容之一是使通道安全,所以我切换到str
我最近一直在使用 PHP构建TCP服务器(我知道错误的选择,但这是工作标准),所以我已经达到了一个可靠的原型来对它进行测试并且它显示了良好的结果.在开始时我使用套接字函数来处理服务器的连接并且它工作正常,但项目的主要内容之一是使通道安全,所以我切换到stream_socket.

我想要的是stream_socket组中的socket_last_error等价物,这样我就可以知道何时关闭与客户端的连接.当前情况所有进程都会等待超时计时器释放,即使客户端已经关闭.

我搜索过网络,发现没有办法通过PHP弄明白,我发现有些人打开了关于它的问题票,要求socket_last_error等效于流.
https://bugs.php.net/bug.php?id=34380

所以无论如何都知道FIN_WAIT信号何时被提升?

谢谢,

我认为它不可能是stream_socket系列,看起来它的级别太高了.

我尝试制作一个非常hackish的解决方案,我不知道它是否适合你,它不是很可靠:

<?php
set_error_handler('my_error_handler');

function my_error_handler($no,$str,$file,$line) {
    throw new ErrorException($str,$no,$line);
}

$socket = stream_socket_server("tcp://0.0.0.0:8000",$errno,$errstr);
if (!$socket) {
  echo "$errstr ($errno)n";
} else {
  while ($conn = stream_socket_accept($socket)) {
    foreach (str_split('The local time is ' . date('n/j/Y g:i a') . "n") as $char) {
      echo $char;
      try {
            fwrite($conn,$char);
      } catch (ErrorException $e) {
            if (preg_match("/^fwrite(): send of 1 bytes failed with errno=([0-9]+) ([A-Za-z /]+)$/",$e->getMessage(),$matches)) {
                    list($errno,$errstr) = array((int) $matches[1],$matches[2]);
                    if ($errno === 32) {
                            echo "n[ERROR] $errstr"; // Broken pipe
                    }
            }
            echo "n[ERROR] Couldn't write more on $conn";
            break;
      }
      fflush($conn);
    }
    fclose($conn);
  }
  fclose($socket);
}
echo "n";
?>

启动:php ./server.php

连接:nc localhost 8000 |头-c1

服务器输出:

The loca
[ERROR] Broken pipe
[ERROR] Couldn't write more on Resource id #6

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读