socket_strerror — Return a string describing a socket error
Описание
socket_strerror() takes as its errno parameter a socket error code as returned by socket_last_error() and returns the corresponding explanatory text.
Although the error messages generated by the socket extension are in English, the system messages retrieved with this function will appear depending on the current locale (LC_MESSAGES).
Список параметров
Возвращаемые значения
Returns the error message associated with the errno parameter.
The expected output from the above example (assuming the script is not run with root privileges):
Смотрите также
socket_accept() — Accepts a connection on a socket
socket_bind() — Binds a name to a socket
socket_connect() — Initiates a connection on a socket
socket_listen() — Listens for a connection on a socket
socket_create() — Create a socket (endpoint for communication)
Что такое код socket_strerror
socket_strerror — возвращает строку — описание ошибки сокета.
Описание
string socket_strerror (int errno)
Предупреждение!
Эта функция — ЭКСПЕРИМЕНТАЛЬНАЯ. Поведение, имя и всё остальное, что задокументировано для данной функции может быть изменено в будущих релизах РНР без предупреждения. Вы можете использовать эту функцию только на свой страх и риск.
Ожидаемый вывод этого пример (предполагая, что скрипт не запущен с привилегиями root):
socket_bind() failed: reason: Permission denied
socket_strerror
Руководство по PHP
Пред.
След.
socket_strerror
(PHP 4 >= 4.1.0, PHP 5)
socket_strerror — Return a string describing a socket error
Description
socket_strerror() takes as its errno parameter a socket error code as returned by socket_last_error() and returns the corresponding explanatory text. This makes it a bit more pleasant to figure out why something d >socket_strerror() , and it tells you what happened.
The expected output from the above example (assuming the script is not run with root privileges):
FPublisher
Web-технологии: База знаний
Документация PHP
socket_strerror
(PHP 4 >= 4.0.7, PHP 5)
socket_strerror — Return a string describing a socket error
Описание
string socket_strerror ( int $errno )
socket_strerror() takes as its errno parameter a socket error code as returned by socket_last_error() and returns the corresponding explanatory text.
Замечание: Although the error messages generated by the socket extension are in English, the system messages retrieved with this function will appear depending on the current locale (LC_MESSAGES).
Список параметров
A valid socket error number, likely produced by socket_last_error().
Возвращаемые значения
Returns the error message associated with the errno parameter.
The expected output from the above example (assuming the script is not run with root privileges):
Socket_strerror
Php функции
Php скрипты
socket_strerror
(PHP 4 >= 4.1.0, PHP 5)
socket_strerror — Return a string describing a socket error
Description
string socket_strerror ( int errno )
socket_strerror() takes as its errno parameter a socket error code as returned by socket_last_error() and returns the corresponding explanatory text. This makes it a bit more pleasant to figure out why something d >for instance, instead of having to track down a system include file to find out what ‘-111’ means, you just pass it to socket_strerror(), and it tells you what happened.
The expected output from the above example (assuming the script is not run with root privileges):
socket_bind() failed: reason: Permission denied
See also socket_accept(), socket_bind(), socket_connect(), socket_listen(), and socket_create().
add a note User Contributed Notes socket_strerror There are no user contributed notes for this page. socket_write socket_shutdown Last updated: Sat, 27 Jan 2007 show source | credits | sitemap | contact | advertising | mirror sites Copyright & copy ; 2001-2007 The PHP Group All rights reserved. This mirror generously provided by: Last updated: Sun Oct 21 04:40:01 2007 MSD
Socket Error Перечисление
Определение
Определяет коды ошибок для класса Socket. Defines error codes for the Socket class.
AccessDenied
10013
Предпринята попытка получить доступ к объекту Socket способом, запрещенным его правами доступа. An attempt was made to access a Socket in a way that is forbidden by its access permissions.
AddressAlreadyInUse
10048
Обычно разрешается использовать только адрес. Only one use of an address is normally permitted.
AddressFamilyNotSupported
10047
Указанное семейство адресов не поддерживается. The address family specified is not supported. Эта ошибка возвращается, если указано семейство IPv6-адресов, а стек протокола IPv6 не установлен на локальном компьютере. This error is returned if the IPv6 address family was specified and the IPv6 stack is not installed on the local machine. Эта ошибка возвращается, если указано семейство IPv4-адресов, а стек протокола IPv4 не установлен на локальном компьютере. This error is returned if the IPv4 address family was specified and the IPv4 stack is not installed on the local machine.
AddressNotAvailable
10049
Выбранный IP-адрес является недопустимым в этом контексте. The selected IP address is not valid in this context.
AlreadyInProgress
10037
На незаблокированном сокете Socket уже выполняется операция. The nonblocking Socket already has an operation in progress.
ConnectionAborted
10053
Подключение разорвано платформой .NET Framework или поставщиком основного сокета. The connection was aborted by the .NET Framework or the underlying socket provider.
ConnectionRefused
10061
Удаленный узел активно отказывает в подключении. The remote host is actively refusing a connection.
ConnectionReset
10054
Подключение сброшено удаленным компьютером. The connection was reset by the remote peer.
DestinationAddressRequired
10039
В операции на сокете Socket пропущен обязательный адрес. A required address was omitted from an operation on a Socket.
Disconnecting
10101
Выполняется правильная последовательность отключения. A graceful shutdown is in progress.
Fault
10014
Поставщиком основного сокета обнаружен недопустимый указатель адреса. An invalid pointer address was detected by the underlying socket provider.
HostDown
10064
Ошибка при выполнении операции, вызванная отключением удаленного узла. The operation failed because the remote host is down.
HostNotFound
11001
Такой узел не существует. No such host is known. Данное имя не является ни официальным именем узла, ни псевдонимом. The name is not an official host name or alias.
HostUnreachable
10065
Отсутствует сетевой маршрут к указанному узлу. There is no network route to the specified host.
InProgress
10036
Выполняется блокирующая операция. A blocking operation is in progress.
Interrupted
10004
Вызов к заблокированному сокету Socketбыл отменен. A blocking Socket call was canceled.
InvalidArgument
10022
Предоставлен недопустимый аргумент для члена объекта Socket. An invalid argument was supplied to a Socket member.
IOPending
997
Приложение инициировало перекрывающуюся операцию, которая не может быть закончена немедленно. The application has initiated an overlapped operation that cannot be completed immediately.
IsConnected
10056
Объект Socket уже подключен. The Socket is already connected.
MessageSize
10040
У датаграммы слишком большая длина. The datagram is too long.
NetworkDown
10050
Сеть недоступна. The network is not available.
NetworkReset
10052
Приложение пытается задать значение KeepAlive для подключения, которое уже отключено. The application tried to set KeepAlive on a connection that has already timed out.
NetworkUnreachable
10051
Не существует маршрута к удаленному узлу. No route to the remote host exists.
NoBufferSpaceAvailable
10055
Отсутствует свободное буферное пространство для операции объекта Socket. No free buffer space is available for a Socket operation.
NoData
11004
Требуемое имя или IP-адрес не найдены на сервере имен. The requested name or IP address was not found on the name server.
NoRecovery
11003
Неустранимая ошибка, или не удается найти запрошенную базу данных. The error is unrecoverable or the requested database cannot be located.
NotConnected
10057
Приложение пытается отправить или получить данные, а объект Socket не подключен. The application tried to send or receive data, and the Socket is not connected.
NotInitialized
10093
Основной поставщик сокета не инициализирован. The underlying socket provider has not been initialized.
NotSocket
10038
Предпринята попытка выполнить операцию объекта Socket не на сокете. A Socket operation was attempted on a non-socket.
OperationAborted
995
Перекрывающаяся операция была прервана из-за закрытия объекта Socket. The overlapped operation was aborted due to the closure of the Socket.
OperationNotSupported
10045
Семейство адресов не поддерживается семейством протоколов. The address family is not supported by the protocol family.
ProcessLimit
10067
Слишком много процессов используется основным поставщиком сокета. Too many processes are using the underlying socket provider.
ProtocolFamilyNotSupported
10046
Семейство протоколов не реализовано или не настроено. The protocol family is not implemented or has not been configured.
ProtocolNotSupported
10043
Протокол не реализован или не настроен. The protocol is not implemented or has not been configured.
ProtocolOption
10042
Для объекта Socket был использован неизвестный, недопустимый или неподдерживаемый параметр или уровень. An unknown, invalid, or unsupported option or level was used with a Socket.
ProtocolType
10041
Неверный тип протокола для данного объекта Socket. The protocol type is incorrect for this Socket.
Shutdown
10058
Запрос на отправку или получение данных отклонен, так как объект Socket уже закрыт. A request to send or receive data was disallowed because the Socket has already been closed.
SocketError
-1
Произошла неопознанная ошибка объекта Socket. An unspecified Socket error has occurred.
SocketNotSupported
10044
Указанный тип сокета не поддерживается в данном семействе адресов. The support for the specified socket type does not exist in this address family.
Операция Socket выполнена успешно. The Socket operation succeeded.
SystemNotReady
10091
Подсистема сети недоступна. The network subsystem is unavailable.
TimedOut
10060
Истекло время ожидания попытки подключения, или произошел сбой при отклике подключенного узла. The connection attempt timed out, or the connected host has failed to respond.
TooManyOpenSockets
10024
Слишком много открытых сокетов в основном поставщике сокета. There are too many open sockets in the underlying socket provider.
TryAgain
11002
Не удалось разрешить имя узла. The name of the host could not be resolved. Повторите попытку позже. Try again later.
TypeNotFound
10109
Указанный класс не найден. The specified class was not found.
VersionNotSupported
10092
Версия основного поставщика сокета выходит за пределы допустимого диапазона. The version of the underlying socket provider is out of range.
WouldBlock
10035
Операция на незаблокированном сокете не может быть закончена немедленно. An operation on a nonblocking socket cannot be completed immediately.
Комментарии
Большинство этих ошибок возвращаются базовым поставщиком сокета. Most of these errors are returned by the underlying socket provider.
Способ 3 — Использование неблокирующих сокетов
Третий способ основан на использовании неблокирующих сокетов (nonblocking sockets) и функции select. Сначала разберёмся, что такое неблокирующие сокеты. Сокеты, которые мы до сих пор использовали, являлись блокирующими (blocking). Это название означает, что на время выполнения операции с таким сокетом ваша программа блокируется. Например, если вы вызвали recv, а данных на вашем конце соединения нет, то в ожидании их прихода ваша программа «засыпает». Аналогичная ситуация наблюдается, когда вы вызываете accept, а очередь запросов на соединение пуста. Это поведение можно изменить, используя функцию fcntl.
sockfd = socket(AF_INET, SOCK_STREAM, 0);
fcntl(sockfd, F_SETFL, O_NONBLOCK);
Эта несложная операция превращает сокет в неблокирующий. Вызов любой функции с таким сокетом будет возвращать управление немедленно. Причём если затребованная операция не была выполнена до конца, функция вернёт -1 и запишет в errno значение EWOULDBLOCK. Чтобы дождаться завершения операции, мы можем опрашивать все наши сокеты в цикле, пока какая-то функция не вернёт значение, отличное от EWOULDBLOCK. Как только это произойдёт, мы можем запустить на выполнение следующую операцию с этим сокетом и вернуться к нашему опрашивающему циклу. Такая тактика (называемая в англоязычной литературе polling) работоспособна, но очень неэффективна, поскольку процессорное время тратится впустую на многократные (и безрезультатные) опросы.
Чтобы исправить ситуацию, используют функцию select. Эта функция позволяет отслеживать состояние нескольких файловых дескрипторов (а в Unix к ним относятся и сокеты) одновременно.
int select(int n, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
FD_CLR(int fd, fd_set *set);
FD_ISSET(int fd, fd_set *set);
FD_SET(int fd, fd_set *set);
Функция select работает с тремя множествами дескрипторов, каждое из которых имеет тип fd_set. В множество readfds записываются дескрипторы сокетов, из которых нам требуется читать данные (слушающие сокеты добавляются в это же множество). Множество writefds должно содержать дескрипторы сокетов, в которые мы собираемся писать, а exceptfds — дескрипторы сокетов, которые нужно контролировать на возникновение ошибки. Если какое-то множество вас не интересуют, вы можете передать вместо указателя на него NULL. Что касается других параметров, в n нужно записать максимальное значение дескриптора по всем множествам плюс единица, а в timeout — величину таймаута. Структура timeval имеет следующий формат.
int tv_sec; // секунды
int tv_usec; // микросекунды
Поле «микросекунды» смотрится впечатляюще. Но на практике вам не добиться такой точности измерения времени при использовании select. Реальная точность окажется в районе 100 миллисекунд.
Теперь займёмся множествами дескрипторов. Для работы с ними предусмотрены функции FD_XXX, показанные выше; их использование полностью скрывает от нас детали внутреннего устройства fd_set. Рассмотрим их назначение.
FD_ZERO(fd_set *set) — очищает множество set
FD_SET(int fd, fd_set *set) — добавляет дескриптор fd в множество set
FD_CLR(int fd, fd_set *set) — удаляет дескриптор fd из множества set
FD_ISSET(int fd, fd_set *set) — проверяет, содержится ли дескриптор fd в множестве set
Если хотя бы один сокет готов к выполнению заданной операции, select возвращает ненулевое значение, а все дескрипторы, которые привели к «срабатыванию» функции, записываются в соответствующие множества. Это позволяет нам проанализировать содержащиеся в множествах дескрипторы и выполнить над ними необходимые действия. Если сработал таймаут, select возвращает ноль, а в случае ошибки -1. Расширенный код записывается в errno.
Программы, использующие неблокирующие сокеты вместе с select, получаются весьма запутанными. Если в случае с fork мы строим логику программы, как будто клиент всего один, здесь программа вынуждена отслеживать дескрипторы всех клиентов и работать с ними параллельно. Чтобы проиллюстрировать эту методику, я в очередной раз переписал код сервера с использованием select. Новая версия приведена в листинге 3. Эта программа, также написана на C++ (а не на C). В программе использовался класс set из библиотеки STL языка C++, чтобы облегчить работу с набором дескрипторов и сделать её более понятной.
Листинг 3. Код сервера (неблокирующие сокеты и select).
Что такое код socket_strerror
socket_strerror — возвращает строку — описание ошибки сокета.
Описание
string socket_strerror (int errno)
Предупреждение!
Эта функция — ЭКСПЕРИМЕНТАЛЬНАЯ. Поведение, имя и всё остальное, что задокументировано для данной функции может быть изменено в будущих релизах РНР без предупреждения. Вы можете использовать эту функцию только на свой страх и риск.
socket_strerror() принимает в качеств параметра errno код ошибки сокета, возвращённый функцией socket_last_error() , и возвращает соответствующий объясняющий текст. Вместо того чтобы заставлять системный include-файл найти, что означает ‘-111’, вы просто передаёте это значение в socket_strerror() , и она объясняет, что произошло.
Что такое код socket_strerror
Функция strerror определена в IEEE Std 1003.1, также известном как POSIX 1.
Реентрабельность
Функция strerror не реентрабельна. Для получения информации о реентрабельной версии данной функции смотри strerror_r.
Использование
Подключение
Объявление
Семантика
Функция генерирует и выводит строку в стиле языка Си с сообщением об ошибке, полученного из кода ошибки, переданного errnum.
Смотри также
strerror_r
perror
ISO/ANSI C
ISO/ANSI C++
POSIX
Единая спецификация UNIX
Ссылки
strerror на сайте OpenGroup
strerror на сайте Codenet
Wikimedia Foundation . 2010 .
Смотреть что такое «Strerror» в других словарях:
strerror — Строковая функция strerror функция языков C/C++, транслирующая код ошибки, который обычно хранится в глобальной переменной errno, в сообщение об ошибке, понятном человеку. Содержание 1 История 2 Реентрабельность … Википедия
Strerror — The string error function, strerror, is a C/C++ function which translates an error code, usually stored in the global variable errno, to a human readable error message.HistoryThe strerror function is defined in IEEE Std 1003.1, also known as… … Wikipedia
Strerr — Строковая функция strerror функция языков C/C++, транслирующая код ошибки, который обычно хранится в глобальной переменной errno, в сообщение об ошибке, понятном человеку. Содержание 1 История 2 Реентрабельность 3 Использование … Википедия
C string handling — C string redirects here. For the underwear and swimwear, see C string (clothing). C Standard Library Data types Character >Wikipedia
Berkeley sockets — The Berkeley sockets application programming interface (API) comprises a library for developing applications in the C programming language that perform inter process communication, most commonly across a computer network.Berkeley sockets (also… … Wikipedia
Сокеты Беркли — Сокеты Беркли интерфейс программирования приложений (API), представляющий собой библиотеку для разработки приложений на языке Си с поддержкой межпроцессного взаимодействия (IPC), часто применяемый в компьютерных сетях. Сокеты Беркли (также… … Википедия
Как найти код ошибки/причину, когда stream_socket_accept() не работает
У меня есть сервер потокового сокета, написанный на PHP. Чтобы узнать, сколько соединений он может обрабатывать одновременно, я написал симулятор в C, чтобы создать 1000 разных клиентов для подключения к серверу.
stream_socket_accept несколько раз возвращал false. Мне нужно выяснить причину этого отказа.
Я попробовал socket_last_error() и socket_strerror() чтобы получить коды ошибок, но они вернули «Успех». Эти функции, похоже, не работают в потоковых сокетах. Есть ли способ/метод, чтобы узнать фактические коды ошибок
Теперь я могу видеть сообщения об ошибках уровня PHP в моих журналах. @ прежде чем stream_socket_accept подавил сообщения об ошибках. (символ @в php)