gpt4 book ai didi

php - 寻找正确的 PHP 套接字错误常量

转载 作者:行者123 更新时间:2023-12-03 11:53:06 25 4
gpt4 key购买 nike

我有一个奇怪的问题,这可能是由于我对套接字编程缺乏经验。

我目前正在使用从 socket_last_error() 获得的原始错误代码编号,因为我认为我需要处理它们。这越来越笨重了。

我想使用预定义的常量(我自己的或内置的)来指代我需要处理的不同类型的套接字错误/条件。

我发现的错误表都使用了相互冲突的值。

http://php.net/manual/en/sockets.constants.php (在列出原始数字的评论中),我看到类似(摘录)的内容:

SOCKET_EINPROGRESS        10036
SOCKET_EALREADY 10037
SOCKET_ENETUNREACH 10051

评论在http://php.net/socket_last_error包含一个列表,其中显然是套接字错误的“标准 C 定义”(?):

define('EINPROGRESS',   115);   /* Operation now in progress */ 
define('EALREADY', 114); /* Operation already in progress */
define('ENETUNREACH', 101); /* Network is unreachable */

我自己系统上的 errno.h 文件(隐藏在/usr/include/asm-generic/中)似乎支持这一点:

#define EINPROGRESS     115     /* Operation now in progress */
#define EALREADY 114 /* Operation already in progress */
#define ENETUNREACH 101 /* Network is unreachable */

然而,这些“标准定义”似乎会根据您使用的操作系统而发生变化:BSD4.4's errno.h有类似的东西

#define EINPROGRESS 36      /* Operation now in progress */
#define EALREADY 37 /* Operation already in progress */
#define ENETUNREACH 51 /* Network is unreachable */

现在我们知道 socket_* 函数的灵感来自于什么了!

最后,我在 the VirtualBox source code 中找到了似乎隐藏着解释的暗示。 :

#ifndef EALREADY
# if defined(RT_ERRNO_OS_BSD)
# define EALREADY (37)
# elif defined(RT_OS_LINUX)
# define EALREADY (114)
# else
# define EALREADY (149)
# endif
#endif

考虑到所有这些......

socket_last_error()Network is unreachable 时返回 101errno ,而不是 5110051。所以这个函数似乎明显违反了套接字库官方提供的常量,并且似乎使用了 Linux 的错误代码。

([添加我的答案后进行编辑]:上述 101 是在 Linux 上获得的。)

所以现在我似乎处于未记录和/或看似未定义的行为领域......我现在该怎么办?我现在在 Linux 上;这些值会改变吗?

有什么方法可以使用官方的 SOCKET_* 常量吗?我当然不介意这样做。

最佳答案

听起来您一直在努力研究这个问题——而且特定于平台的内容可能会令人讨厌。让我建议这段代码,它表面上会获取所有定义的常量,这些常量组合在一起作为“套接字”常量:

$consts = get_defined_constants(TRUE);
$socket_constants = $consts["sockets"];
foreach($socket_constants as $key => $value){
echo $key . '=' . $value . "\n";
}

据此,我能够构建这个函数,您可能会发现它在任何平台上都有用,可用于查找可能匹配的套接字常量的名称

function get_socket_constant_names($to_check) {
$consts = get_defined_constants(TRUE);
$socket_constants = $consts["sockets"];
$matches = array();
foreach($socket_constants as $key => $value){
if ($value == $to_check) {
$matches[] = $key;
}
}
return $matches;
}

这个:

var_dump(get_socket_constant_names(101));

产生这个:

array(1) {
[0] =>
string(18) "SOCKET_ENETUNREACH"
}

关于php - 寻找正确的 PHP 套接字错误常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41579771/

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