Что такое код socket_writev


socket_write

(PHP 4 >= 4.1.0, PHP 5, PHP 7)

socket_write — Запись в сокет

Описание

Функция socket_write() записывает в сокет socket данные из указанного буфера buffer .

Список параметров

Буфер, который будет записан.

Необязательный параметр length может указывать другое число байт, записываемых в сокет. Если это число больше, чем длина буфера, оно будет молча урезано до длины буфера.

Возвращаемые значения

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

Совершенно нормально для функции socket_write() возвращать ноль, что означает, что ни одного байта не было записано. Пожалуйста, используйте оператор === для проверки значения на FALSE в случае ошибки.

Примечания

socket_write() не обязательно записывает все байты из указанного буфера. Нормально то, что, в зависимости от сетевых буферов и т. д., только некоторое количество данных, даже один байт, будет записан, хотя ваш буфер больше. Вы должны следить за тем, чтобы непреднамеренно не забыть передать остаток ваших данных.

Смотрите также

  • socket_accept() — Принимает соединение на сокете
  • socket_bind() — Привязывает имя к сокету
  • socket_connect() — Начинает соединение с сокетом
  • socket_listen() — Прослушивает входящие соединения на сокете
  • socket_read() — Читает строку байт максимальной длины length из сокета
  • socket_strerror() — Возвращает строку, описывающую ошибку сокета

Запись в сокет

(PHP 4 >= 4.1.0, PHP 5, PHP 7)

socket_write — Запись в сокет

Описание

Функция socket_write() записывает в сокет socket данные из указанного буфера buffer .

Список параметров

Буфер, который будет записан.

Необязательный параметр length может указывать другое число байт, записываемых в сокет. Если это число больше, чем длина буфера, оно будет молча урезано до длины буфера.

Возвращаемые значения

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

Совершенно нормально для функции socket_write() возвращать ноль, что означает, что ни одного байта не было записано. Пожалуйста, используйте оператор === для проверки значения на FALSE в случае ошибки.

Примечания

socket_write() не обязательно записывает все байты из указанного буфера. Нормально то, что, в зависимости от сетевых буферов и т. д., только некоторое количество данных, даже один байт, будет записан, хотя ваш буфер больше. Вы должны следить за тем, чтобы непреднамеренно не забыть передать остаток ваших данных.

Смотрите также

  • socket_accept() — Принимает соединение на сокете
  • socket_bind() — Привязывает имя к сокету
  • socket_connect() — Начинает соединение с сокетом
  • socket_listen() — Listens for a connection on a socket
  • socket_read() — Читает строку байт максимальной длины length из сокета
  • socket_strerror() — Возвращает строку, описывающую ошибку сокета

Что такое код socket_writev

socket_write — записывает в сокет.

Описание

int socket_write (resource socket, string buffer [, int length])

Эта функция — ЭКСПЕРИМЕНТАЛЬНАЯ. Поведение, имя и всё остальное, что задокументировано для данной функции может быть изменено в будущих релизах РНР без предупреждения. Вы можете использовать эту функцию только на свой страх и риск.

Функция socket_write() записывает в сокет socket из буфера buffer .

Необязательный параметр length может специфицировать альтернативную длину байтов, записываемых в сокет. Если параметр length больше длины буфера, он скрыто усекается до длины буфера.

Возвращает количество байтов, успешно записанных в сокет, или FALSE при ошибке. Код ошибки можно запросить функцией socket_last_error() . Этот код можно передать функции socket_strerror() для получения текстового объяснения ошибки.

Примечание: socket_write() не обязательно записывает все байты из данного буфера. В зависимости от сетевых буферов etc., записывается только определённое количество данных, даже один байт, даже если ваш буфер больше. Вы должны отследить, чтобы не забыть случайно, передачу остатка ваших данных.

Примечание: для socket_write() совершенно правильным будет возврат 0, что означает отсутствие записанных байтов. Используйте операцию === для проверки FALSE в случае ошибки.

socket_writev

socket_writev — записывает в дескриптор файла fd, используя scatter-gather массив, определённый в iovec_id.

Описание

bool socket_writev (resource socket, resource iovec_id)

Предупреждение!

Эта функция — ЭКСПЕРИМЕНТАЛЬНАЯ. Поведение, имя и всё остальное, что задокументировано для данной функции может быть изменено в будущих релизах РНР без предупреждения. Вы можете использовать эту функцию только на свой страх и риск.

Предупреждение!

Эта функция в настоящее время ещё не задокументирована; имеется только список аргументов.

socket_write

socket_write — записывает в сокет.

Описание

int socket_write (resource socket, string buffer [, int length])

Предупреждение!

Эта функция — ЭКСПЕРИМЕНТАЛЬНАЯ. Поведение, имя и всё остальное, что задокументировано для данной функции может быть изменено в будущих релизах РНР без предупреждения. Вы можете использовать эту функцию только на свой страх и риск.

Функция socket_write() записывает в сокет socket из буфера buffer.

Необязательный параметр length может специфицировать альтернативную длину байтов, записываемых в сокет. Если параметр length больше длины буфера, он скрыто усекается до длины буфера.

Возвращает количество байтов, успешно записанных в сокет, или FALSE при ошибке. Код ошибки можно запросить функцией socket_last_error(). Этот код можно передать функции socket_strerror() для получения текстового объяснения ошибки.

Примечание: socket_write() не обязательно записывает все байты из данного буфера. В зависимости от сетевых буферов etc., записывается только определённое количество данных, даже один байт, даже если ваш буфер больше. Вы должны отследить, чтобы не забыть случайно, передачу остатка ваших данных.

Примечание: для socket_write() совершенно правильным будет возврат 0, что означает отсутствие записанных байтов. Используйте операцию === для проверки FALSE в случае ошибки.

Что такое код socket_writev

socket_write — записывает в сокет.

Описание

int socket_write (resource socket, string buffer [, int length])

Предупреждение!

Эта функция — ЭКСПЕРИМЕНТАЛЬНАЯ. Поведение, имя и всё остальное, что задокументировано для данной функции может быть изменено в будущих релизах РНР без предупреждения. Вы можете использовать эту функцию только на свой страх и риск.

Функция socket_write() записывает в сокет socket из буфера buffer .

Необязательный параметр length может специфицировать альтернативную длину байтов, записываемых в сокет. Если параметр length больше длины буфера, он скрыто усекается до длины буфера.

Возвращает количество байтов, успешно записанных в сокет, или FALSE при ошибке. Код ошибки можно запросить функцией socket_last_error() . Этот код можно передать функции socket_strerror() для получения текстового объяснения ошибки.

Примечание: socket_write() не обязательно записывает все байты из данного буфера. В зависимости от сетевых буферов etc., записывается только определённое количество данных, даже один байт, даже если ваш буфер больше. Вы должны отследить, чтобы не забыть случайно, передачу остатка ваших данных.

Примечание: для socket_write() совершенно правильным будет возврат 0, что означает отсутствие записанных байтов. Используйте операцию === для проверки FALSE в случае ошибки.

socket & write()

Здравствуйте. В каком случае вызов write на сокете может заблокировать программу? read() понятно, что если нету данных. а write() ? Я к тому, что следует ли перед вызовом проверить сокет poll()-м на возможность записи или это лишнее?

Re: socket & write()

> Я к тому, что следует ли перед вызовом проверить сокет poll()-м на возможность записи или это лишнее?

write() запросто может заблокировать, если с другой стороны read() не делать.

Re: socket & write()

Ладно, опишу проблему более детально: общаюсь с сервером — сперва он мне строку кидает, затем я ему. Вот и заинтересовало — если он мне кинул строку, и я ее получил — то он наверняка меня уже ждет, и я могу сразу же начать писать в сокет, без промежуточного poll(), а затем уже вызвать его для проверки на чтение. Или все же не стоит так делать, и вызывать poll() для проверки на запись?

Re: socket & write()

>write() запросто может заблокировать, если с другой стороны read() не делать.

Чисто по-человечески интересно: если сокет неблокирующий, то это все равно возможно? Или «неблокируемость» относится только к чтению?

Re: socket & write()

> Чисто по-человечески интересно: если сокет неблокирующий, то это все равно возможно? Или «неблокируемость» относится только к чтению?

флаг O_NONBLOCK относится и к записи и к чтению.

Re: socket & write()

anonymous (*) (21.09.2005 7:39:28):

> . если он мне кинул строку, и я ее получил — то он наверняка меня уже ждет,

Может сеть зависнуть, может сервер зависнуть на сисколе (под большой нагрузкой — запросто!), может еще что.

Я бы всегда делал poll()

Re: socket & write()

Да — самое простое — заполненность сетевых буферов. write() при этом будет ждать освобождения, по идее.

Re: socket & write()

А как именно poll() узнает, что запись не будет заблокирована? Это в кратце можно рассказать? Про чтение то вроде понятно, даже по netstat видно когда данные есть, а запись мне непонятна.

Re: socket & write()

Re: socket & write()

Мне кажеться, что вы правы. Однако, например, Die-Hard утверждает, что использовать O_NONBLOCK вместе с select/pool не имеет смысла в общем случае.

Re: socket & write()

я склонен считать что idle более прав

Re: socket & write()

> Однако, например, Die-Hard утверждает, что использовать O_NONBLOCK вместе с select/pool не имеет смысла в общем случае.

Может, я и не прав.

Источник моих знаний:

1. man select: . more precisely, to see if a read will not block . those in writefds will be watched to see if a write will not block.

2. За многолетнюю практику со мной ни разу не случалось, чтобы select() меня подвел. Каждый раз, когда i/o блокировалось после select’а, объяснялся ошибками в программе. Причем мне приходилось писать довольно сложную логику на многочисленных пайпах и сокетах, месяцами интенсивно работающих в синхронном режиме.

Re: socket & write()

> это уже обсуждалось здесь, поищите.

А ключевые слова не подскажешь?

Re: socket & write()

>А ключевые слова не подскажешь?

Re: socket & write()

Re: socket & write()

Re: socket & write()

Ну, это — другое дело!

Это как раз те самые случаи, про которые я говорил «немногие, когда нужен неблокирующий I/O».

На самом деле, это вопрос больше самодисциплины. Это как с goto. По моим наблюдениям (над собой), почти всякий раз, когда возникало искушение поставить O_NONBLOCK, находилось более «правильное» решение с блокирующим I/O.

> возможно всего один байт, а ты передашь ему 2.

> ты читаешь больше, чем пришло данных

предусмотрены, просто операторы write()/read() вернут число, меньшее последнего аргумента. Блокировка наступает, если read() не может прочитать ни одного байта и при этом не EOF.

То же самое с write().

Re: socket & write()

Re: socket & write()

> но я не знаю гарантируется ли такое поведение стандартами (особенно если иметь в виду устройства всякие), я бы не стал закладываться.

Ну, драйвер можно написать сколь угодно криво, но тогда и O_NONBLOCK может не помочь!

Про пайпы, стримы и файлы стандарты прописаны. Например, у меня под руками есть The Single UNIX (R) Specification, Version 2:

If some process has the pipe open for writing and O_NONBLOCK is clear, read() will block the calling thread until some data is written or the pipe is closed by all processes that had the pipe open for writing.

When attempting to read a file (other than a pipe or FIFO) that supports non-blocking reads and has no data currently available .

The use of the O_NONBLOCK flag has no effect if there is some data available.

> для записи это совсем не верно: будет спать.

Да, тут я подзабыл. Чтобы write() вернул меньше, надо как раз O_NONBLOCK ставить, я и сам так делаю, сейчас посмотрел :)

socket_write

(PHP 4 >= 4.1.0, PHP 5, PHP 7)

socket_write — Запись в сокет

Описание

Функция socket_write() записывает в сокет socket данные из указанного буфера buffer .

Список параметров

Буфер, который будет записан.

Необязательный параметр length может указывать другое число байт, записываемых в сокет. Если это число больше, чем длина буфера, оно будет молча урезано до длины буфера.

Возвращаемые значения

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

Совершенно нормально для функции socket_write() возвращать ноль, что означает, что ни одного байта не было записано. Пожалуйста, используйте оператор === для проверки значения на FALSE в случае ошибки.

Примечания

socket_write() не обязательно записывает все байты из указанного буфера. Нормально то, что, в зависимости от сетевых буферов и т. д., только некоторое количество данных, даже один байт, будет записан, хотя ваш буфер больше. Вы должны следить за тем, чтобы непреднамеренно не забыть передать остаток ваших данных.

Смотрите также

  • socket_accept() — Принимает соединение на сокете
  • socket_bind() — Привязывает имя к сокету
  • socket_connect() — Начинает соединение с сокетом
  • socket_listen() — Прослушивает входящие соединения на сокете
  • socket_read() — Читает строку байт максимальной длины length из сокета
  • socket_strerror() — Возвращает строку, описывающую ошибку сокета

Запись в сокет

(PHP 4 >= 4.1.0, PHP 5, PHP 7)

socket_write — Запись в сокет

Описание

Функция socket_write() записывает в сокет socket данные из указанного буфера buffer .

Список параметров

Буфер, который будет записан.

Необязательный параметр length может указывать другое число байт, записываемых в сокет. Если это число больше, чем длина буфера, оно будет молча урезано до длины буфера.

Возвращаемые значения

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

Совершенно нормально для функции socket_write() возвращать ноль, что означает, что ни одного байта не было записано. Пожалуйста, используйте оператор === для проверки значения на FALSE в случае ошибки.

Примечания

socket_write() не обязательно записывает все байты из указанного буфера. Нормально то, что, в зависимости от сетевых буферов и т. д., только некоторое количество данных, даже один байт, будет записан, хотя ваш буфер больше. Вы должны следить за тем, чтобы непреднамеренно не забыть передать остаток ваших данных.

Смотрите также

  • socket_accept() — Принимает соединение на сокете
  • socket_bind() — Привязывает имя к сокету
  • socket_connect() — Начинает соединение с сокетом
  • socket_listen() — Listens for a connection on a socket
  • socket_read() — Читает строку байт максимальной длины length из сокета
  • socket_strerror() — Возвращает строку, описывающую ошибку сокета

Как установить PHP socket_write и кодировку символов socket_read?

Я пишу PHP-сервер, и клиент отправляет данные в кодировке определенного символа. Теперь я хочу сказать серверу читать и записывать данные в этом же наборе кодировки символов.

Как я должен указать набор кодировки символов для PHP socket_read и socket_write?

Эти функции передают строку без преобразования (т.е. байта по байту), поэтому вы не можете установить кодировку символов. Но это также означает, что вам это не нужно. У вас будет одна и та же строка с другой стороны с той же самой кодировкой.

Вы можете преобразовать его перед отправкой/после получения строки с помощью mb_convert_encoding() .

PHP поддерживает почти нулевую автоматическую кодировку символов. Вы должны будете следить за тем, какая кодировка какой-либо данной строки, и убедитесь, что она преобразуется в подходящую кодировку каждый раз, когда она вводит или покидает ваш код. Как только хороший способ сделать это — решить, что все интерлайн-строки находятся в определенной кодировке (например, PHP) и конвертируют каждую входящую строку в эту кодировку на своем пути.

Илон Маск рекомендует:  PHP regexp примеры регулярных выражений
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL
Предупреждение!