PHP Conference Japan 2024

socket_last_error

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

socket_last_error返回套接字上的最后一个错误

描述

socket_last_error(?Socket $socket = null): int

如果将 Socket 实例传递给此函数,则返回在此特定套接字上发生的最后一个错误。如果 socketnull,则返回最后一个失败的套接字函数的错误代码。后者对于 socket_create() 等在失败时不返回套接字的函数以及 socket_select() 等可能因不直接与特定套接字相关的原因而失败的函数特别有用。错误代码适合馈送到 socket_strerror(),后者返回描述给定错误代码的字符串。

如果未发生错误,或已使用 socket_clear_error() 清除错误,则函数返回 0

参数

socket

使用 socket_create() 创建的 Socket 实例。

返回值

此函数返回套接字错误代码。

变更日志

版本 描述
8.0.0 socket 现在是 Socket 实例;以前,它是一个 resource
8.0.0 socket 现在可以为空。

示例

示例 #1 socket_last_error() 示例

<?php
$socket
= @socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

if (
$socket === false) {
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);

die(
"无法创建套接字:[$errorcode] $errormsg");
}
?>

备注

注意:

socket_last_error() 不会清除错误代码,为此目的,请使用 socket_clear_error()

添加注释

用户贡献的注释 2 条注释

ca at php dot spamtrak dot org
14 年前
这有点长,但就我个人而言,我更喜欢在我的代码中使用标准的 C 定义。



<?php

define
('ENOTSOCK', 88); /* 非套接字上的套接字操作 */
define('EDESTADDRREQ', 89); /* 需要目标地址 */
define('EMSGSIZE', 90); /* 消息过长 */
define('EPROTOTYPE', 91); /* 协议类型与套接字不符 */
define('ENOPROTOOPT', 92); /* 协议不可用 */
define('EPROTONOSUPPORT', 93); /* 不支持协议 */
define('ESOCKTNOSUPPORT', 94); /* 不支持套接字类型 */
define('EOPNOTSUPP', 95); /* 传输端点不支持操作 */
define('EPFNOSUPPORT', 96); /* 不支持协议族 */
define('EAFNOSUPPORT', 97); /* 协议不支持地址族 */
define('EADDRINUSE', 98); /* 地址已在使用 */
define('EADDRNOTAVAIL', 99); /* 无法分配请求的地址 */
define('ENETDOWN', 100); /* 网络已断开 */
define('ENETUNREACH', 101); /* 网络不可达 */
define('ENETRESET', 102); /* 网络由于重置而断开连接 */
define('ECONNABORTED', 103); /* 软件导致连接中止 */
define('ECONNRESET', 104); /* 对等方重置连接 */
define('ENOBUFS', 105); /* 没有可用的缓冲区空间 */
define('EISCONN', 106); /* 传输端点已连接 */
define('ENOTCONN', 107); /* 传输端点未连接 */
define('ESHUTDOWN', 108); /* 传输端点关闭后无法发送 */
define('ETOOMANYREFS', 109); /* 引用过多:无法拼接 */
define('ETIMEDOUT', 110); /* 连接超时 */
define('ECONNREFUSED', 111); /* 连接被拒绝 */
define('EHOSTDOWN', 112); /* 主机已关闭 */
define('EHOSTUNREACH', 113); /* 没有到主机的路由 */
define('EALREADY', 114); /* 操作已经在进行 */
define('EINPROGRESS', 115); /* 操作正在进行 */
define('EREMOTEIO', 121); /* 远程 I/O 错误 */
define('ECANCELED', 125); /* 操作已取消 */
?>
divinity76 at gmail dot com
5 年前
请注意,socket_last_error() 缓存来自上次套接字系统调用的最后一个错误,它实际上并没有查询操作系统以获取套接字上的最后一个错误,因此,如果异步套接字在上次异步操作成功启动后发生错误,socket_last_error() 就不知道它,但 socket_get_option($sock, SOL_SOCKET, SO_ERROR) 确实查询了操作系统,或者至少看起来是这样......在 Windows 7 x64 SP1 上的 Cygwin 上的 PHP 7.1.16 上观察到使用非阻塞套接字,socket_last_error() 从未意识到当前错误已从 EINPROGRESS(非阻塞连接)更改为 0(连接成功)
To Top