Socket write error что значит

socket_write

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

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

Описание

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

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

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

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

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

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

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

Список изменений

Версия Описание
8.0.0 socket теперь экземпляр класса Socket ; ранее был ресурсом ( resource ).
8.0.0 length теперь допускает значение null.

Примечания

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

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

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

User Contributed Notes 8 notes

Here we have the same function to write a socket but with improved performance.

If the messager are not larger, they will be written entirely with a single socket_write() call. And is not needed to call the substr() function for the first bucle.

= «Message to sent» ;
$length = strlen ( $st );

$sent = socket_write ( $socket , $st , $length );

if ( $sent === false ) <

// Check if the entire message has been sented
if ( $sent $length ) <

// If not sent the entire message.
// Get the part of the message that has not yet been sented as message
$st = substr ( $st , $sent );

// Get the length of the not sented part
$length -= $sent ;

I often read in php docs users not checking for the php function returned value, and in the case of socket_write, I could not see here in the comment anyone botering to read on the socket the server reply.
Then one user thought it would be a good idea to use usleep after a socket_write on a smtp connection.
Actually, if you check the server reply, not only will it give time for the server to reply before you write again on the socket, but also this is a great opportunity to check what the server replied you.
For instance, for smtp connection :
In this example MAIL_SERVER, MAIL_PORT and DEBUG are constants I defined.
function sendmail ( $param )
<
$from = & $param [ ‘from’ ];
$to = & $param [ ‘to’ ];
$message = & $param [ ‘data’ ];

$isError = function( $string )
<
if( preg_match ( ‘/^((\d)(\d<2>))/’ , $string , $matches ) )
<
if( $matches [ 2 ] == 4 || $matches [ 2 ] == 5 ) return( $matches [ 1 ] );
>
else
<
return( false );
>
>;

try
<
$socket = null ;
if( ( $socket = socket_create ( AF_INET , SOCK_STREAM , SOL_TCP ) ) == false )
<
throw new Exception ( sprintf ( «Unable to create a socket: %s» , socket_strerror ( socket_last_error () ) ) );
>
if( ! socket_connect ( $socket , MAIL_SERVER , MAIL_PORT ) )
<
throw new Exception ( sprintf ( «Unable to connect to server %s: %s» , MAIL_SERVER , socket_strerror ( socket_last_error () ) ) );
>
$read = socket_read ( $socket , 1024 );
if( $read == false )
<
throw new Exception ( sprintf ( «Unable to read from socket: %s» , socket_strerror ( socket_last_error () ) ) );
>

if( socket_write ( $socket , sprintf ( «HELO %s\r\n» , gethostname () ) ) === false )
<
throw new Exception ( sprintf ( «Unable to write to socket: %s» , socket_strerror ( socket_last_error () ) ) );
>
$read = socket_read ( $socket , 1024 );
if( $read == false )
<
throw new Exception ( sprintf ( «Unable to read from socket: %s» , socket_strerror ( socket_last_error () ) ) );
>
else
<
if( ( $errCode = $isError ( $read ) ) ) throw new Exception ( «Server responded with an error code $errCode » );
>

if( socket_write ( $socket , sprintf ( «MAIL FROM: %s\r\n» , $from ) ) === false )
<
throw new Exception ( sprintf ( «Unable to write to socket: %s» , socket_strerror ( socket_last_error () ) ) );
>
$read = socket_read ( $socket , 1024 );
if( $read == false )
<
throw new Exception ( sprintf ( «Unable to read from socket: %s» , socket_strerror ( socket_last_error () ) ) );
>
else
<
if( ( $errCode = $isError ( $read ) ) ) throw new Exception ( «Server responded with an error code $errCode » );
>
/* And some more code, but not enough place in comment */
return( $totalWriten );
>
catch( Exception $e )
<
$ERROR = sprintf ( «Error sending mail message at line %d. » , $e -> getLine () ) . $e -> getMessage ();
return( false );
>
>

Источник

Как решить «Соединение reset по ошибке peer: socket write»?

Когда я читаю содержимое файла с сервера, он возвращает следующее сообщение об ошибке:

и моя программа сервлета

Как решить эту проблему?

ОТВЕТЫ

Ответ 1

У меня такое же исключение, и в моем случае проблема была в процессе пересмотра. На самом деле мой клиент закрыл соединение, когда сервер попытался изменить набор шифров. После копания появляется, что в процессе обновления jdk 1.6 22 по умолчанию отключен. Если ваши ограничения безопасности могут это сделать, попробуйте включить небезопасное пересмотр, установив для системного свойства sun.security.ssl.allowUnsafeRenegotiation значение true . Вот некоторая информация о процессе:

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

Кроме того, есть отличный пост об этой проблеме в деталях и написанный на (ИМХО) понятный язык.

Ответ 2

Сокет был закрыт клиентом (браузером).

Последний пакет считывается, тогда запись может иметь длину & ​​lt; 4096, поэтому я предлагаю:

Это не ваш вопрос, но это мой ответ. ; -)

Ответ 3

Правильный способ «решить» это закрыть соединение и забыть о клиенте. Клиент закрыл соединение, пока вы все еще пишете его, поэтому он не хочет вас знать, так что это не так?

Ответ 4

Кажется, что ваша проблема может возникнуть в

где он может перейти в бесконечный цикл, чтобы не продвигать смещение (которое всегда равно 0 в вызове). Попробуйте

который по умолчанию попытается прочитать upto outputByte.length в byte[] . Таким образом, вам не нужно беспокоиться о смещении. См. Метод чтения FileInputStrem

Ответ 5

У меня была та же проблема с небольшой разницей:

Исключение было поднято в момент промывки

Это другая проблема fooobar.com/info/48324/. . Краткое объяснение было неправильной настройкой заголовка ответа:

response.setHeader( «Content-Encoding», «gzip» );

несмотря на несжатое содержимое данных ответа.

Таким образом, соединение было закрыто браузером.

Источник

Официальные причины для «Программного обеспечения прерывания соединения: ошибка записи сокета»

Учитывая этот фрагмент трассировки стека

Вызвано: java.net.SocketException: Программное обеспечение вызвало прерывание соединения: ошибка записи сокета at java.net.SocketOutputStream.socketWrite0 (Native Метод)

Я попытался ответить на следующие вопросы:

  • Какой код выбрасывает это исключение? (JVM?/Tomcat?/Мой код?)
  • Что вызывает это исключение?

Относительно # 1:

Источник Sun JVM не содержит этого точного сообщения, но я думаю, что текстовое программное обеспечение вызвало прерывание соединения: ошибка записи сокета из встроенной реализации SocketOutputStream :

Относительно # 2

Я предполагаю, что это вызвано, когда клиент завершил соединение, прежде чем получить полный ответ (например, отправил запрос, но прежде чем получить полный ответ, он был закрыт/завершен/отключен)

Вопросы:

  • Правильны ли следующие допущения (# 1 и # 2)?
  • Может ли это отличаться от ситуации: «Не удалось написать клиенту из-за сетевой ошибки на стороне сервера»? или будет отображать одно и то же сообщение об ошибке?
  • И самое главное: Есть ли официальный документ (например, от Sun), указав выше?

Мне нужно иметь доказательство того, что эта трассировка стека является «ошибкой» сокета клиента, и ничего не может сделать сервер, чтобы его избежать. (за исключением исключения или использования не SUN JVM SocketOutputStream, хотя оба не исключают того, что клиент завершил работу)

ОТВЕТЫ

Ответ 1

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

Ответ 2

java.net.SocketException генерируется, когда возникает ошибка при создании или доступе к сокету (например, TCP). Обычно это может быть вызвано тем, что сервер разорвал соединение (без надлежащего закрытия), поэтому перед получением полного ответа. В большинстве случаев это может быть вызвано либо проблемой тайм-аута (например, ответ занимает слишком много времени, либо сервер перегружен запросами), либо клиент отправил SYN, но он не получил ACK (подтверждение завершения соединения), Для проблем тайм-аута, вы можете рассмотреть возможность увеличения значения тайм-аута.

Исключение Socket обычно поставляется с указанным подробным сообщением о проблеме.

Пример подробных сообщений:

Программное обеспечение вызвало прерывание соединения: сбой recv.

Ошибка указывает на попытку отправить сообщение, и соединение было прервано вашим сервером. Если это произошло при подключении к базе данных, это может быть связано с использованием несовместимого драйвера JDBC Connector/J.

Возможное решение: убедитесь, что в вашей CLASSPATH есть нужные библиотеки/драйверы.

Программное обеспечение вызвало прерывание соединения: соединение.

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

Возможное решение: Проверить службу антивирусной проверки, не блокирует ли она порт для исходящих запросов на подключение.

Программное обеспечение вызвало прерывание соединения: ошибка записи в сокет.

Возможное решение: убедитесь, что вы записываете правильную длину байтов в поток. Поэтому дважды проверьте, что вы отправляете. Смотрите эту тему.

Сброс соединения по пиру: ошибка записи сокета/Соединение прервано по адресу: ошибка записи сокета

Приложение не проверяет, истекло ли время ожидания активности на стороне сервера.

Возможное решение: убедитесь, что HttpClient не нулевой, прежде чем читать из соединения. E13222_01

Соединение было прервано узлом (сервером).

Соединение было прервано клиентом или закрыто серверным концом соединения из-за запроса с запросом.

Ответ 3

Я видел это чаще всего, когда корпоративный брандмауэр на рабочей станции/ноутбуке мешает, он убивает соединение.

например. У меня есть серверный процесс и клиентский процесс на одной машине. Сервер прослушивает все интерфейсы (0.0.0.0), и клиент пытается подключиться к общедоступному/домашнему интерфейсу (обратите внимание не на интерфейс loopback 127.0.0.1).

Если устройство отключено от сети (например, отключено Wi-Fi), соединение будет сформировано. Если устройство подключено к корпоративной сети (напрямую или vpn), соединение будет сформировано.

Однако, если машина подключена к общедоступному Wi-Fi (или домашней сети), то брандмауэр ударяет по убитому соединению. В этой ситуации подключение клиента к интерфейсу loopback работает нормально, а не только в домашнем/общедоступном интерфейсе.

Надеюсь, что это поможет.

Ответ 4

Чтобы доказать, что компонент не работает, я мог бы отслеживать связь TCP/IP с помощью wireshark и посмотреть, кто является actaully, закрывающим порт, также таймауты могут быть релевантными.

Ответ 5

Вы проверили исходный код Tomcat и источник JVM? Это может помочь вам.

Я думаю, что ваше общее мышление хорошее. Я ожидал бы ConnectException в сценарии, который вы не могли подключить. Вышеприведенное выглядит очень похоже на клиентское управление.

Ответ 6

Для тех, кто использует простые программы Client Server и получает эту ошибку, это проблема незакрытых (или закрытых для ранних) потоков ввода или вывода.

Ответ 7

Я столкнулся с той же проблемой.
Обычно эта ошибка возникает из-за того, что клиент закрыл свое соединение, а сервер все еще пытается писать на этом клиенте.
Поэтому убедитесь, что ваш клиент имеет свое соединение открытым до тех пор, пока сервер не выполнит свой выходной поток.
И еще одно: Дон не забыл закрыть поток ввода и вывода.

Надеюсь, это поможет.
И если вы все еще сталкиваетесь с проблемой, а не кратко изложите свою проблему здесь подробно.

Ответ 8

Эта ошибка произошла со мной при тестировании моей мыльной службы с клиентом SoapUI, в основном я пытался получить очень большое сообщение ( > 500 кб), а SoapUI закрыл соединение таймаутом.

Файл → Настройки — Тайм-аут сокета (мс)

. и поставьте большое значение, например 180000 (3 минуты), это не будет идеальным решением для вашей проблемы, потому что файл на самом деле большой, но по крайней мере у вас будет ответ.

Ответ 9

Закрытое соединение в другом клиенте

В моем случае ошибка была:

Он был получен в eclipse при отладке приложения Java, обращающегося к базе данных H2. Источником ошибки было то, что я сначала открыл базу данных с помощью SQuirreL, чтобы проверить целостность вручную. Я использовал флаг для включения нескольких подключений к одному и тому же БД (т.е. AUTO_SERVER=TRUE ), поэтому не было проблем с подключением к базе данных из java.

Ошибка появилась, когда через некоторое время — это длинный Java-процесс — я решил закрыть SQuirreL для освобождения ресурсов. Похоже, что SQuirreL был «владельцем» экземпляра сервера БД и что он был отключен с помощью соединения SQuirreL.

Перезапуск приложения Java снова не принесло ошибки.

CONFIG

  • Windows 7
  • Eclipse Kepler
  • SQuirreL 3.6
  • org.h2.Driver ver 1.4.192

Ответ 10

Мой сервер выбрасывал это исключение в течение 2 дней, и я решил его, переместив функцию отключения:

В конец листинга. если это кому-то помогло.

Ответ 11

В ситуации, описанной ниже, клиентская сторона создаст такое исключение:

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

Ответ 12

Клиентская сторона ssl сгенерирует такое исключение в следующей ситуации (я проверял):

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

Ответ 13

Я столкнулся с той же проблемой с wireMock, одновременно высмеивая остальные вызовы API. Раньше я определял сервер следующим образом:

Но он должен быть определен, как показано ниже:

Источник

Читайте также:  Что значит маркая поверхность
Оцените статью