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

标签 php sockets constants

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

我目前正在使用从 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/

相关文章:

php - 将特定字母替换为范围数字并使用 php 在数据库中搜索

php - Cakephp分页问题

c# - 客户端之间的客户端服务器UDP连接c#

php - 我可以使用不是磁盘上文件的证书来使用 SSL 套接字吗? (即在数据库中)

c - 解析分块的 HTTP/1.1 响应

php - php和mysql中的自动完成文本框

php - 我可以调用 PHP 方法来异步运行吗?

javascript - const 已经在 ES6 开关 block 中声明

kotlin - 在 Kotlin 中创建全局常量的正确方法是什么?

c++ - GCC 允许 1 行声明多个指针,但不是非指针,具有不同的 const 限定符