(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)
socket_last_error — Lee el último error generado por un socket
Si una instancia de Socket es pasada a esta función, el último error
que haya sido generado por este socket será devuelto. Si socket
es null , el último código de error generado es devuelto.
Este comportamiento es particularmente práctico para funciones como
socket_create() que no devuelven un socket
en caso de fallo, y socket_select() que puede
fallar sin razón directamente relacionada con el socket. El código de error
puede ser transmitido a socket_strerror() que devuelve
un mensaje de error legible.
Si no ha ocurrido ningún error, o si el error ha sido
eliminado con la función socket_clear_error() ,
esta función devolverá 0.
Devuelve el código de error asociado al socket.
| Versión | Descripción |
|---|---|
| 8.0.0 |
socket ahora es una instancia de Socket ;
anteriormente, era un resource .
|
| 8.0.0 |
socket ahora es nullable.
|
Ejemplo #1 Ejemplo con 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("Imposible crear el socket : [$errorcode] $errormsg");
}
?>Nota:
socket_last_error() no borra el código de error. Utilice en su lugar la función socket_clear_error() para ello.
This is a bit long, but personally I prefer to use the standard C defines in my code.
<?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 */
?>note that socket_last_error() cache the last error from the last socket syscall, it does not actually query the OS for the last error on the socket, so if an async socket have an error after the last async operation started successfully, socket_last_error() doesn't know about it, but socket_get_option($sock, SOL_SOCKET, SO_ERROR) actually query the OS, or so it seems... observed on PHP 7.1.16 on Cygwin on win7 x64 SP1 with non-blocking sockets, socket_last_error() never caught on to the fact that the current error had changed from EINPROGRESS (non-blocking connect) to 0 (connection successful)