Socket strerror: примеры (PHP)
socket_strerror(int errno): stringФункция socket_strerror возвращает строковое описание ошибки сокета на основе переданного кода ошибки. Она используется при работе с низкоуровневыми сетевыми операциями для получения удобочитаемого сообщения об ошибке, что упрощает отладку.
Функция принимает один обязательный параметр:
- error_code (int) – код ошибки сокета. Обычно этот код возвращается функциями socket_last_error() или socket_recv() при неудачных операциях.
Функция возвращает строку с описанием ошибки, соответствующей переданному коду. Если код неизвестен, возвращается сообщение \"Unknown error\".
<? $errorCode = 10061; // Код ошибки WSAECONNREFUSED в Windows $errorDescription = socket_strerror($errorCode); echo \"Код ошибки: $errorCode
\"; echo \"Описание: $errorDescription\"; ?>
Код ошибки: 10061 Описание: Connection refused
<?
$socket = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
$error = socket_last_error();
echo \"Ошибка создания сокета: \" . socket_strerror($error);
}
?>Ошибка создания сокета: Protocol not supported
<? $unknownError = 99999; echo socket_strerror($unknownError); ?>
Unknown error
- socket_last_error() – возвращает последний код ошибки сокета. Часто используется вместе с socket_strerror для получения описания.
- strerror() – возвращает описание системной ошибки по её коду. Аналогична socket_strerror, но работает с глобальными кодами ошибок, а не только сокетов.
- Exception-классы – в современных приложениях предпочтительнее использовать исключения (например, RuntimeException) с пользовательскими сообщениями, так как это улучшает структуру обработки ошибок.
Функцию socket_strerror стоит применять при низкоуровневой работе с сокетами, тогда как для высокоуровневых сетевых библиотек лучше использовать исключения.
Модуль errno и функция os.strerror().
import os import errno error_code = errno.ECONNREFUSED print(os.strerror(error_code))
Connection refused
Объект ошибки с свойством 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
Функция strerror() из заголовочного файла string.h.
#include#include #include int main() { printf(\"%s\\n\", strerror(ECONNREFUSED)); return 0; }
Connection refused
В отличие от PHP, в Python и C функции работают с общими системными ошибками, а в Node.js ошибки сокетов обычно представлены объектами с полями code и message.
<? // Передача строки вместо целого числа $result = socket_strerror(\"10061\"); echo $result; ?>
Warning: socket_strerror() expects parameter 1 to be int, string given
<?
$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 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 ?>
<?
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
<?
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]);
?><?
$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 возвращает соответствующие описания для текущей платформы.