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 现在可以为 null。

示例

示例 #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(
"Couldn't create socket: [$errorcode] $errormsg");
}
?>

注释

注意:

socket_last_error() 不会清除错误代码,请使用 socket_clear_error() 来实现此目的。

添加笔记

用户贡献的笔记 2 个笔记

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

<?php

define
('ENOTSOCK', 88); /* Socket operation on non-socket */
define('EDESTADDRREQ', 89); /* Destination address required */
define('EMSGSIZE', 90); /* Message too long */
define('EPROTOTYPE', 91); /* Protocol wrong type for socket */
define('ENOPROTOOPT', 92); /* Protocol not available */
define('EPROTONOSUPPORT', 93); /* Protocol not supported */
define('ESOCKTNOSUPPORT', 94); /* Socket type not supported */
define('EOPNOTSUPP', 95); /* Operation not supported on transport endpoint */
define('EPFNOSUPPORT', 96); /* Protocol family not supported */
define('EAFNOSUPPORT', 97); /* Address family not supported by protocol */
define('EADDRINUSE', 98); /* Address already in use */
define('EADDRNOTAVAIL', 99); /* Cannot assign requested address */
define('ENETDOWN', 100); /* Network is down */
define('ENETUNREACH', 101); /* Network is unreachable */
define('ENETRESET', 102); /* Network dropped connection because of reset */
define('ECONNABORTED', 103); /* Software caused connection abort */
define('ECONNRESET', 104); /* Connection reset by peer */
define('ENOBUFS', 105); /* No buffer space available */
define('EISCONN', 106); /* Transport endpoint is already connected */
define('ENOTCONN', 107); /* Transport endpoint is not connected */
define('ESHUTDOWN', 108); /* Cannot send after transport endpoint shutdown */
define('ETOOMANYREFS', 109); /* Too many references: cannot splice */
define('ETIMEDOUT', 110); /* Connection timed out */
define('ECONNREFUSED', 111); /* Connection refused */
define('EHOSTDOWN', 112); /* Host is down */
define('EHOSTUNREACH', 113); /* No route to host */
define('EALREADY', 114); /* Operation already in progress */
define('EINPROGRESS', 115); /* Operation now in progress */
define('EREMOTEIO', 121); /* Remote I/O error */
define('ECANCELED', 125); /* Operation Canceled */
?>
1
divinity76 at gmail dot com
5 年前
请注意,socket_last_error() 会缓存上一次套接字系统调用的最后一个错误。它不会实际查询操作系统以获取套接字上的最后一个错误。因此,如果异步套接字在上次异步操作成功启动后发生错误,socket_last_error() 不会知道该错误,但是 socket_get_option($sock, SOL_SOCKET, SO_ERROR) 会实际查询操作系统,或者至少看起来是这样...... 这是在 PHP 7.1.16 上使用 Cygwin 在 win7 x64 SP1 上使用非阻塞套接字观察到的,socket_last_error() 从未发现当前错误已从 EINPROGRESS(非阻塞连接)更改为 0(连接成功)。
To Top