Socket strerror: примеры (PHP)

Функция socket_strerror: обработка сетевых ошибок в PHP
Раздел: Сокеты
socket_strerror(int errno): string
Описание функции socket_strerror

Функция socket_strerror возвращает строковое описание ошибки сокета на основе переданного кода ошибки. Она используется при работе с низкоуровневыми сетевыми операциями для получения удобочитаемого сообщения об ошибке, что упрощает отладку.

Аргументы функции

Функция принимает один обязательный параметр:

  • error_code (int) – код ошибки сокета. Обычно этот код возвращается функциями socket_last_error() или socket_recv() при неудачных операциях.

Функция возвращает строку с описанием ошибки, соответствующей переданному коду. Если код неизвестен, возвращается сообщение \"Unknown error\".

Примеры использования socket_strerror
Пример 1: Получение описания стандартной ошибки
<?
$errorCode = 10061; // Код ошибки WSAECONNREFUSED в Windows
$errorDescription = socket_strerror($errorCode);
echo \"Код ошибки: $errorCode
\"; echo \"Описание: $errorDescription\"; ?>
Код ошибки: 10061
Описание: Connection refused
Пример 2: Использование с socket_last_error
<?
$socket = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    $error = socket_last_error();
    echo \"Ошибка создания сокета: \" . socket_strerror($error);
}
?>
Ошибка создания сокета: Protocol not supported
Пример 3: Неизвестный код ошибки
<?
$unknownError = 99999;
echo socket_strerror($unknownError);
?>
Unknown error
Похожие функции в PHP
  • socket_last_error() – возвращает последний код ошибки сокета. Часто используется вместе с socket_strerror для получения описания.
  • strerror() – возвращает описание системной ошибки по её коду. Аналогична socket_strerror, но работает с глобальными кодами ошибок, а не только сокетов.
  • Exception-классы – в современных приложениях предпочтительнее использовать исключения (например, RuntimeException) с пользовательскими сообщениями, так как это улучшает структуру обработки ошибок.

Функцию socket_strerror стоит применять при низкоуровневой работе с сокетами, тогда как для высокоуровневых сетевых библиотек лучше использовать исключения.

Альтернативы в других языках
Python

Модуль errno и функция os.strerror().

import os
import errno
error_code = errno.ECONNREFUSED
print(os.strerror(error_code))
Connection refused
JavaScript (Node.js)

Объект ошибки с свойством code и модуль util.

const dns = require('dns');
dns.lookup('nonexistent', (err) => {
  if (err) {
    console.log(err.code); // Например, 'ENOTFOUND'
    console.log(err.message);
  }
});
ENOTFOUND
getaddrinfo ENOTFOUND nonexistent
C

Функция strerror() из заголовочного файла string.h.

#include 
#include 
#include 
int main() {
    printf(\"%s\\n\", strerror(ECONNREFUSED));
    return 0;
}
Connection refused

В отличие от PHP, в Python и C функции работают с общими системными ошибками, а в Node.js ошибки сокетов обычно представлены объектами с полями code и message.

Типичные ошибки при использовании
Ошибка 1: Передача некорректного типа аргумента
<?
// Передача строки вместо целого числа
$result = socket_strerror(\"10061\");
echo $result;
?>
Warning: socket_strerror() expects parameter 1 to be int, string given
Ошибка 2: Использование без проверки сокета
<?
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
// Попытка подключения к несуществующему порту
if (!@socket_connect($socket, '127.0.0.1', 9999)) {
    // Пропущен вызов socket_last_error()
    $message = socket_strerror($socket); // Передаётся ресурс, а не код
    echo $message;
}
?>
Warning: socket_strerror() expects parameter 1 to be int, resource given

Для избежания ошибок всегда проверяйте тип аргумента и используйте socket_last_error() для получения кода.

Изменения в последних версиях PHP

В PHP 8.0 функция socket_strerror не претерпела значительных изменений. Однако, в PHP 8 усилилась строгость типизации, поэтому передача нецелочисленного аргумента вызывает TypeError, а не предупреждение. Ранее, до PHP 8, аргумент автоматически преобразовывался в int.

<?
// В PHP 7.4 и ранее
socket_strerror(\"10061\"); // Предупреждение, но работает
// В PHP 8.0+
socket_strerror(\"10061\"); // TypeError: socket_strerror(): Argument #1 must be of type int, string given
?>
Расширенные примеры использования
Пример 1: Создание пользовательского обработчика ошибок сокетов
<?
function handleSocketError($socket, string $operation): void {
    $errorCode = socket_last_error($socket);
    if ($errorCode !== 0) {
        $errorMsg = socket_strerror($errorCode);
        socket_clear_error($socket);
        throw new RuntimeException(\"Ошибка при $operation: [$errorCode] $errorMsg\");
    }
}

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
try {
    if (!@socket_connect($socket, 'example.com', 80)) {
        handleSocketError($socket, 'подключении');
    }
} catch (RuntimeException $e) {
    echo $e->getMessage();
}
?>
Ошибка при подключении: [110] Connection timed out
Пример 2: Логирование ошибок сокетов с дополнительной информацией
<?
function logSocketError(int $errorCode, array $context = []): void {
    $message = socket_strerror($errorCode);
    $logEntry = date('Y-m-d H:i:s') . \" - Код ошибки: $errorCode, Описание: $message\";
    if (!empty($context)) {
        $logEntry .= ', Контекст: ' . json_encode($context);
    }
    error_log($logEntry);
}

// Пример вызова
logSocketError(10054, ['host' => '192.168.1.1', 'port' => 8080]);
?>
Пример 3: Сравнение ошибок на разных платформах
<?
$errorCodes = [111, 10061, 13];
foreach ($errorCodes as $code) {
    $description = socket_strerror($code);
    echo \"Код $code: $description
\"; } ?>
Код 111: Connection refused
Код 10061: Connection refused
Код 13: Permission denied

Коды ошибок могут различаться между операционными системами, но socket_strerror возвращает соответствующие описания для текущей платформы.

PHP socket_strerror function comments

En
Socket strerror Return a string describing a socket error