我有一个奇怪的问题,这可能是由于我对套接字编程缺乏经验。
我目前正在使用从 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
时返回 101
的 errno
,而不是 51
或 10051
。所以这个函数似乎明显违反了套接字库官方提供的常量,并且似乎使用了 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/