Предупреждение PHP: socket_read (): невозможно прочитать из сокета [104]: сброс соединения по пиру

я использую socket_create() создать сокет Ресурс, тогда я связываю IP обратиться к нему по socket_bind()работает нормально;

Но через некоторое время (более 30 минут) в очереди socket_read($sock, 2048) эта ошибка выдана:

"PHP Warning: socket_read(): unable to read from socket [104]: Connection reset by peer in test.php on line 198",

Это мой упрощенный код:

$this->sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

// check if tcp socket ceated or not
if ($this->sock === false) {
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Couldn't create socket: [$errorcode] $errormsg");
}

// Bind the source address
socket_bind($this->sock, $this->ip);
// Connect to destination address
socket_connect($this->sock, $this->mxHost, $this->port);
$buf = socket_read($this->sock, 2048);

Этот фрагмент кода устанавливает SMTP-соединение (порт 25) с MX-хостом на другой стороне.
Может быть, это ошибка на другой стороне вашего соединения, но как я могу обнаружить, что другая сторона не готова к соединению сейчас. Другими словами, как я могу узнать, что произошел «Сброс соединения по пиру»?

1

Решение

Вы должны проверить, если socket_connect() был успешным, прежде чем читать из него.

так что вы можете переписать свой код следующим образом:

— ОБНОВЛЕНО —

$this->sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
// Bind the source address
socket_bind($this->sock, $this->ip);
// Connect to destination address
if (socket_connect($this->sock, $this->mxHost, $this->port)) {
// suppress the warning for now since we have error checking below
$buf = @socket_read($this->sock, 2048);

// socket_read() returns a zero length string ("") when there is no more data to read.
// This indicates that the socket is closed on the other side.
if ($buf === '')
{
throw new \Exception('Connection reset by peer');
}
} else {
// Connection was not successful. Get the last error and throw an exception
$errorMessage = socket_strerror(socket_last_error());
throw new \Exception($errorMessage);
}
1

Другие решения

Хм … Ваш пэр сбросил соединение. Может быть, это ошибка на другой стороне вашего соединения? Механизм тайм-аута может быть запущен на другой стороне.

Вы можете проверить сокет, прежде чем писать в него с помощью socket_last_error функционировать и воссоздать соединение при разъединении.

0

По вопросам рекламы [email protected]