gpt4 book ai didi

php - 如何知道连接何时被 peer 在 php 中重置?

转载 作者:可可西里 更新时间:2023-11-01 02:31:06 25 4
gpt4 key购买 nike

我最近一直致力于使用 PHP 构建 TCP 服务器(我知道开始时的选择是错误的,但这是工作标准),所以我已经达到了一个可靠的原型(prototype)来对其进行测试的地步显示出良好的效果。一开始我使用套接字函数来处理服务器连接,它运行良好,但该项目的主要任务之一是确保 channel 安全,因此我切换到 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,0,$file,$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

关于php - 如何知道连接何时被 peer 在 php 中重置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9953336/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com