I’m having this strange error, CURL ERROR: Recv failure: Connection reset by peer
This is how it happens, if I did not connect to the server and all of a sudden trying to connect to the server via CURL in PHP I get the error. When I run the CURL script again the error disappears and then works well the whole time, if I leave the remote server idle for about 30mins or reboot the remote server and try to connect again, I get the error again. So it seems like the connection is idle and then all of sudden the server wakes up and then works and then sleeps again.
This is how my CURL script looks.
$url = Yii::app()->params['pdfUrl'];
            $body = 'title='.urlencode($title).'&client_url='.Yii::app()->params['pdfClientURL'].'&client_id='.Yii::app()->params['pdfClientID'].'&content='.urlencode(htmlentities($content));
            $c = curl_init ($url);
            $body = array(
                "client_url"=>Yii::app()->params['pdfClientURL'],
                "client_id"=>Yii::app()->params['pdfClientID'],
                "title"=>urlencode($title),
                "content"=>urlencode($content)
            );
            foreach($body as $key=>$value) { $body_str .= $key.'='.$value.'&'; }
                rtrim($body_str,'&');
            curl_setopt ($c, CURLOPT_POST, true);
            curl_setopt ($c, CURLOPT_POSTFIELDS, $body_str);
            curl_setopt ($c, CURLOPT_RETURNTRANSFER, true);
            curl_setopt ($c, CURLOPT_CONNECTTIMEOUT , 0);
            curl_setopt ($c, CURLOPT_TIMEOUT  , 20);
            $pdf = curl_exec ($c);
            $errorCode = curl_getinfo($c, CURLINFO_HTTP_CODE);
            $curlInfo = curl_getinfo($c);
            $curlError = curl_error($c);
            curl_close ($c);
I’m totally out of ideas and solutions, please help, I’ll appreciate it!!!
If I verbose the output to see what happens using
curl_setopt ($c, CURLOPT_VERBOSE, TRUE);
curl_setopt($c, CURLOPT_STDERR, $fp); 
I get the following
* About to connect() to 196.41.139.168 port 80 (#0)
*   Trying 196.x.x.x... * connected
* Connected to 196.x.x.x (196.x.x.x) port 80 (#0)
> POST /serve/?r=pdf/generatePdf HTTP/1.1
Host: 196.x.x.x
Accept: */*
Content-Length: 7115
Content-Type: application/x-www-form-urlencoded
Expect: 100-continue
* Recv failure: Connection reset by peer
* Closing connection #0
012 20:23:49 GMT
< Server: Apache/2.2.15 (CentOS)
< X-Powered-By: PHP/5.3.3
< Connection: close
< Transfer-Encoding: chunked
< Content-Type: text/html; charset=UTF-8
< 
* Closing connection #0
I’ve added in the following toe remove the default header and still no luck:
curl_setopt ($c, CURLOPT_HTTPHEADER, array( 'Expect:' ) );
> Accept: */* Content-Length: 8414 Content-Type:
> application/x-www-form-urlencoded
> 
> * Recv failure: Connection reset by peer
> * Closing connection #0 r: Apache/2.2.15 (CentOS) < X-Powered-By: PHP/5.3.3 < Connection: close < Transfer-Encoding: chunked <
> Content-Type: text/html; charset=UTF-8 < 
> * Closing connection #0
I’m having this strange error, CURL ERROR: Recv failure: Connection reset by peer
This is how it happens, if I did not connect to the server and all of a sudden trying to connect to the server via CURL in PHP I get the error. When I run the CURL script again the error disappears and then works well the whole time, if I leave the remote server idle for about 30mins or reboot the remote server and try to connect again, I get the error again. So it seems like the connection is idle and then all of sudden the server wakes up and then works and then sleeps again.
This is how my CURL script looks.
$url = Yii::app()->params['pdfUrl'];
            $body = 'title='.urlencode($title).'&client_url='.Yii::app()->params['pdfClientURL'].'&client_id='.Yii::app()->params['pdfClientID'].'&content='.urlencode(htmlentities($content));
            $c = curl_init ($url);
            $body = array(
                "client_url"=>Yii::app()->params['pdfClientURL'],
                "client_id"=>Yii::app()->params['pdfClientID'],
                "title"=>urlencode($title),
                "content"=>urlencode($content)
            );
            foreach($body as $key=>$value) { $body_str .= $key.'='.$value.'&'; }
                rtrim($body_str,'&');
            curl_setopt ($c, CURLOPT_POST, true);
            curl_setopt ($c, CURLOPT_POSTFIELDS, $body_str);
            curl_setopt ($c, CURLOPT_RETURNTRANSFER, true);
            curl_setopt ($c, CURLOPT_CONNECTTIMEOUT , 0);
            curl_setopt ($c, CURLOPT_TIMEOUT  , 20);
            $pdf = curl_exec ($c);
            $errorCode = curl_getinfo($c, CURLINFO_HTTP_CODE);
            $curlInfo = curl_getinfo($c);
            $curlError = curl_error($c);
            curl_close ($c);
I’m totally out of ideas and solutions, please help, I’ll appreciate it!!!
If I verbose the output to see what happens using
curl_setopt ($c, CURLOPT_VERBOSE, TRUE);
curl_setopt($c, CURLOPT_STDERR, $fp); 
I get the following
* About to connect() to 196.41.139.168 port 80 (#0)
*   Trying 196.x.x.x... * connected
* Connected to 196.x.x.x (196.x.x.x) port 80 (#0)
> POST /serve/?r=pdf/generatePdf HTTP/1.1
Host: 196.x.x.x
Accept: */*
Content-Length: 7115
Content-Type: application/x-www-form-urlencoded
Expect: 100-continue
* Recv failure: Connection reset by peer
* Closing connection #0
012 20:23:49 GMT
< Server: Apache/2.2.15 (CentOS)
< X-Powered-By: PHP/5.3.3
< Connection: close
< Transfer-Encoding: chunked
< Content-Type: text/html; charset=UTF-8
< 
* Closing connection #0
I’ve added in the following toe remove the default header and still no luck:
curl_setopt ($c, CURLOPT_HTTPHEADER, array( 'Expect:' ) );
> Accept: */* Content-Length: 8414 Content-Type:
> application/x-www-form-urlencoded
> 
> * Recv failure: Connection reset by peer
> * Closing connection #0 r: Apache/2.2.15 (CentOS) < X-Powered-By: PHP/5.3.3 < Connection: close < Transfer-Encoding: chunked <
> Content-Type: text/html; charset=UTF-8 < 
> * Closing connection #0
у меня эта странная ошибка,ошибка CURL: ошибка Recv: сброс соединения одноранговым узлом
вот как это происходит, если я не подключался к серверу и вдруг пытаюсь подключиться к серверу через CURL в PHP, я получаю ошибку. Когда я снова запускаю сценарий CURL, ошибка исчезает, а затем работает хорошо все время, если я оставляю удаленный сервер в режиме ожидания около 30 минут или перезагружаю удаленный сервер и пытаюсь подключиться снова, я снова получаю ошибку. Так что кажется, что соединение простаивает, а затем внезапно сервер просыпается, а затем работает, а затем снова спит.
вот как выглядит мой сценарий CURL.
$url = Yii::app()->params['pdfUrl'];
            $body = 'title='.urlencode($title).'&client_url='.Yii::app()->params['pdfClientURL'].'&client_id='.Yii::app()->params['pdfClientID'].'&content='.urlencode(htmlentities($content));
            $c = curl_init ($url);
            $body = array(
                "client_url"=>Yii::app()->params['pdfClientURL'],
                "client_id"=>Yii::app()->params['pdfClientID'],
                "title"=>urlencode($title),
                "content"=>urlencode($content)
            );
            foreach($body as $key=>$value) { $body_str .= $key.'='.$value.'&'; }
                rtrim($body_str,'&');
            curl_setopt ($c, CURLOPT_POST, true);
            curl_setopt ($c, CURLOPT_POSTFIELDS, $body_str);
            curl_setopt ($c, CURLOPT_RETURNTRANSFER, true);
            curl_setopt ($c, CURLOPT_CONNECTTIMEOUT , 0);
            curl_setopt ($c, CURLOPT_TIMEOUT  , 20);
            $pdf = curl_exec ($c);
            $errorCode = curl_getinfo($c, CURLINFO_HTTP_CODE);
            $curlInfo = curl_getinfo($c);
            $curlError = curl_error($c);
            curl_close ($c);
Я полностью из идей и решений, пожалуйста, помогите, я буду признателен!!!
если я подробный вывод, чтобы увидеть, что происходит с помощью
curl_setopt ($c, CURLOPT_VERBOSE, TRUE);
curl_setopt($c, CURLOPT_STDERR, $fp); 
Я получаю следующее
* About to connect() to 196.41.139.168 port 80 (#0)
*   Trying 196.x.x.x... * connected
* Connected to 196.x.x.x (196.x.x.x) port 80 (#0)
> POST /serve/?r=pdf/generatePdf HTTP/1.1
Host: 196.x.x.x
Accept: */*
Content-Length: 7115
Content-Type: application/x-www-form-urlencoded
Expect: 100-continue
* Recv failure: Connection reset by peer
* Closing connection #0
012 20:23:49 GMT
< Server: Apache/2.2.15 (CentOS)
< X-Powered-By: PHP/5.3.3
< Connection: close
< Transfer-Encoding: chunked
< Content-Type: text/html; charset=UTF-8
< 
* Closing connection #0
Я добавил в следующем toe удалить заголовок по умолчанию и по-прежнему не повезло:
curl_setopt ($c, CURLOPT_HTTPHEADER, array( 'Expect:' ) );
> Accept: */* Content-Length: 8414 Content-Type:
> application/x-www-form-urlencoded
> 
> * Recv failure: Connection reset by peer
> * Closing connection #0 r: Apache/2.2.15 (CentOS) < X-Powered-By: PHP/5.3.3 < Connection: close < Transfer-Encoding: chunked <
> Content-Type: text/html; charset=UTF-8 < 
> * Closing connection #0
6 ответов
введение
удаленный сервер отправил вам первый пакет, который указывает на немедленное падение соединения, а не обычное рукопожатие.
Возможные Причины
А. TCP / IP
это может быть проблема TCP / IP, которую вам нужно решить с вашим хостом или обновить ОС в большинстве случаев соединение закрывается перед удаленным сервером, прежде чем он закончит загрузку содержимого в Connection reset by peer….. 
Б. Каннель Ошибка
обратите внимание, что есть некоторые проблемы с масштабированием окна TCP на некоторых ядрах Linux после v2.6.17. Дополнительные сведения см. В следующих отчетах об ошибках:
https://bugs.launchpad.net/ubuntu/+source/linux-source-2.6.17/+bug/59331
https://bugs.launchpad.net/ubuntu/+source/linux-source-2.6.20/+bug/89160
С. PHP & CURL ошибка
вы используете PHP/5.3.3, который имеет ряд серьезных ошибок … я бы посоветовал вам работать с более новой версией PHP и CURL 
https://bugs.php.net/bug.php?id=52828
https://bugs.php.net/bug.php?id=52827
https://bugs.php.net/bug.php?id=52202
https://bugs.php.net/bug.php?id=50410
Д. максимум Блок Передачи
одной из распространенных причин этой ошибки является то, что размер MTU (максимальная единица передачи) пакетов, перемещающихся по сетевому соединению, был изменен с значения по умолчанию 1500 байт.
Если вы настроили VPN это, скорее всего, должно быть изменено во время конфигурации 
Д. Брандмауэр: iptables
если вы не знаете свой путь вокруг этих парней, они могут вызвать серьезные проблемы .. попробуйте получить доступ к сервер к которому вы подключаетесь, проверьте следующее
- у вас есть доступ к порту 80 на этом сервере
 
пример
 -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT`
- следующее В последней строке не перед любым другим ACCEPT
 
пример
  -A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited 
- 
проверьте все падение, отклонить и убедитесь, что они не блокируют ваше соединение
 - 
временно разрешить все подключения, Как видите если он враг
 
эксперимент
попробуйте другой сервер или удаленный сервер (так много платного облачного хостинга онлайн) и протестируйте тот же сценарий .. если это сработает, то я думаю, что это так же хорошо, как правда … You need to update your system 
Другие Связанные С Кодом
А. протокол SSL
если Yii::app()->params['pdfUrl'] — это URL-адрес с https не включая правильную настройку SSL также может вызвать эту ошибку в старой версии curl 
разрешение: убедитесь, что OpenSSL установлен и включен, а затем добавьте это в свой код
curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($c, CURLOPT_SSL_VERIFYHOST, false);
надеюсь, это поможет
обычно эта ошибка означает, что соединение было установлено с сервером, но это соединение было закрыто удаленным сервером. Это может быть связано с медленным сервером, проблемой с удаленным сервером, сетевой проблемой или (возможно) какой-то ошибкой безопасности с отправкой данных на удаленный сервер, но я нахожу это маловероятным.
обычно сетевая ошибка разрешится сама по себе, если дать ей немного времени, но похоже, что вы уже дали ей немного времени.
скручиваемость иногда возникают проблемы с SSL и сертификаты SSL.
Я думаю, что ваш Apache и/или PHP был скомпилирован с последней версией библиотек Curl и curl SSL плюс я не думаю, что OpenSSL был установлен на вашем веб-сервере.
хотя я не могу быть уверен, однако, я считаю, что cURL исторически был flakey с сертификатами SSL, в то время как Open SSL этого не делает.
в любом случае, попробуйте установить Open SSL на сервере и повторите попытку, и это должно помочь вам избавиться от этого ошибка.
Итак, что такое URL-адрес, который Yii::app()->params['pdfUrl'] дает?  Вы говорите, что это должен быть https, но журнал показывает, что он подключается к порту 80… который почти не настроен на сервер для приема https-соединений.  cURL достаточно умен, чтобы знать, что https должен быть на порту 443… что предполагает, что Ваш URL-адрес имеет что-то шаткое в нем, как: https://196.41.139.168:80/serve/?r=pdf/generatePdf
это приведет к прекращению соединения, когда Apache на другом конце не сможет выполнить https-связь с вами на этом порт.
вы осознаете свой первый $body определение заменяется при установке $body в массив двумя строками позже?  {Вероятно, это просто артефакт, который вы пытаетесь решить проблему} вы также не кодируете client_url и client_id значения (первые, вполне возможно, содержащие символы, которые нуждаются в экранировании!) О, и вы добавляете к $body_str без его инициализации.
из вашего подробного вывода мы видим, что cURL добавляет content-length заголовок, но… это правильно?  Я вижу, что некоторые комментарии в интернете этого числа ошибочны (особенно с более старыми версиями)… если бы это число было небольшим (например), вы бы получили сброс соединения до отправки всех данных.  Вы можете вручную вставить заголовок:
curl_setopt ($c, CURLOPT_HTTPHEADER, 
   array("Content-Length: ". strlen($body_str))); 
О, и есть удобная функция http_build_query это преобразует массив пар имя / значение в строку, закодированную URL для вас.
все это закатывается в финал код:
$post=http_build_query(array(
  "client_url"=>Yii::app()->params['pdfClientURL'],
  "client_id"=>Yii::app()->params['pdfClientID'],
  "title"=>$title,
  "content"=>$content));
//Open to URL
$c=curl_init(Yii::app()->params['pdfUrl']);
//Send post
curl_setopt ($c, CURLOPT_POST, true);
//Optional: [try with/without]
curl_setopt ($c, CURLOPT_HTTPHEADER, array("Content-Length: ".strlen($post))); 
curl_setopt ($c, CURLOPT_POSTFIELDS, $post);
curl_setopt ($c, CURLOPT_RETURNTRANSFER, true);
curl_setopt ($c, CURLOPT_CONNECTTIMEOUT , 0);
curl_setopt ($c, CURLOPT_TIMEOUT  , 20);
//Collect result
$pdf = curl_exec ($c);
$curlInfo = curl_getinfo($c);
curl_close($c);
это проблема брандмауэра, если вы используете приложение VMware, убедитесь, что брандмауэр антивируса выключен или разрешены подключения.
Если этот сервер находится в защищенной сети, ознакомьтесь с правилами брандмауэра сервера.
спасибо
Ганеш ПНС
в моем случае была проблема в URL. Я использую https://example.com — но они обеспечивают » www.- так, когда я переключился на https://www.example.com все было ок. Правильный заголовок был отправлен ‘Host: www.example.com’.
вы можете попробовать сделать запрос в firefox brwoser, сохранить его и скопировать как cURL-вот как я его нашел.
я столкнулся с той же ошибки, но по-другому.
когда вы сворачиваете страницу с определенным протоколом SSL.
curl --sslv3 https://example.com
Если —sslv3 не поддерживается целевым сервером, то ошибка будет
curl: (35) сброс TCP-соединения одноранговым узлом
с поддерживаемым протоколом ошибка исчезнет.
curl --tlsv1.2 https://example.com
I’m having this strange error, CURL ERROR: Recv failure: Connection reset by peer
This is how it happens, if I did not connect to the server and all of a sudden trying to connect to the server via CURL in PHP I get the error. When I run the CURL script again the error disappears and then works well the whole time, if I leave the remote server idle for about 30mins or reboot the remote server and try to connect again, I get the error again. So it seems like the connection is idle and then all of sudden the server wakes up and then works and then sleeps again.
This is how my CURL script looks.
$url = Yii::app()->params['pdfUrl'];
            $body = 'title='.urlencode($title).'&client_url='.Yii::app()->params['pdfClientURL'].'&client_id='.Yii::app()->params['pdfClientID'].'&content='.urlencode(htmlentities($content));
            $c = curl_init ($url);
            $body = array(
                "client_url"=>Yii::app()->params['pdfClientURL'],
                "client_id"=>Yii::app()->params['pdfClientID'],
                "title"=>urlencode($title),
                "content"=>urlencode($content)
            );
            foreach($body as $key=>$value) { $body_str .= $key.'='.$value.'&'; }
                rtrim($body_str,'&');
            curl_setopt ($c, CURLOPT_POST, true);
            curl_setopt ($c, CURLOPT_POSTFIELDS, $body_str);
            curl_setopt ($c, CURLOPT_RETURNTRANSFER, true);
            curl_setopt ($c, CURLOPT_CONNECTTIMEOUT , 0);
            curl_setopt ($c, CURLOPT_TIMEOUT  , 20);
            $pdf = curl_exec ($c);
            $errorCode = curl_getinfo($c, CURLINFO_HTTP_CODE);
            $curlInfo = curl_getinfo($c);
            $curlError = curl_error($c);
            curl_close ($c);
I’m totally out of ideas and solutions, please help, I’ll appreciate it!!!
If I verbose the output to see what happens using
curl_setopt ($c, CURLOPT_VERBOSE, TRUE);
curl_setopt($c, CURLOPT_STDERR, $fp); 
I get the following
* About to connect() to 196.41.139.168 port 80 (#0)
*   Trying 196.x.x.x... * connected
* Connected to 196.x.x.x (196.x.x.x) port 80 (#0)
> POST /serve/?r=pdf/generatePdf HTTP/1.1
Host: 196.x.x.x
Accept: */*
Content-Length: 7115
Content-Type: application/x-www-form-urlencoded
Expect: 100-continue
* Recv failure: Connection reset by peer
* Closing connection #0
012 20:23:49 GMT
< Server: Apache/2.2.15 (CentOS)
< X-Powered-By: PHP/5.3.3
< Connection: close
< Transfer-Encoding: chunked
< Content-Type: text/html; charset=UTF-8
< 
* Closing connection #0
I’ve added in the following toe remove the default header and still no luck:
curl_setopt ($c, CURLOPT_HTTPHEADER, array( 'Expect:' ) );
> Accept: */* Content-Length: 8414 Content-Type:
> application/x-www-form-urlencoded
> 
> * Recv failure: Connection reset by peer
> * Closing connection #0 r: Apache/2.2.15 (CentOS) < X-Powered-By: PHP/5.3.3 < Connection: close < Transfer-Encoding: chunked <
> Content-Type: text/html; charset=UTF-8 < 
> * Closing connection #0
| 
 Кодер 49 / 48 / 7 Регистрация: 10.10.2010 Сообщений: 229  | 
|
| 
 1  | 
|
| 
 07.09.2013, 22:22. Показов 2362. Ответов 9 
 			Привет всем. Если знаете, прошу не пропускать эту тему мимо. Заранее спасибо. 
		__________________ 
 0           | 
| 
 Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782  | 
07.09.2013, 22:22 | 
| 
 Ответы с готовыми решениями: send, recv и close 
 
 Не могу разобраться с send и recv Winsock 9  | 
| 
 567 / 198 / 70 Регистрация: 25.05.2012 Сообщений: 816  | 
|
| 
 09.09.2013, 05:22  | 
 2  | 
| 
 
 Привет всем. Return value 0 возвращается только при корректном закрытии соединения другой стороной. Соответственно ответ — нет, в данном случае recv() не вернет 0. Второе развитие событий: Опять нет, send ничего не знает о том, приняты ли данные другой стороной. 
 0           | 
| 
 Модератор 3352 / 2127 / 349 Регистрация: 13.01.2012 Сообщений: 8,290  | 
|
| 
 09.09.2013, 09:30  | 
 3  | 
| 
 
 1 — ответ — нет думаю ответ — да — разве «If no error occurs» не заставит функцию завершится по факту разрыва соединения? 
 2 — ответ — нет думаю ответ — да — сразу же вернет ошибку 
 0           | 
| 
 567 / 198 / 70 Регистрация: 25.05.2012 Сообщений: 816  | 
|
| 
 09.09.2013, 10:48  | 
 4  | 
| 
 
 думаю ответ — да — разве «If no error occurs» не заставит функцию завершится по факту разрыва соединения? Будет висеть до истечения таймаута. Откуда recv узнает, что соединение разорвалось, если клиент ничего не отправил, не данных, не информации, что он отваливается? recv будет тупо ждать данных, тут же простая логика. думаю ответ — да — сразу же вернет ошибку Если соединение уже разорвано (корректно) на момент вызова send(), то да. 
 0           | 
| 
 2924 / 1273 / 114 Регистрация: 27.05.2008 Сообщений: 3,465  | 
|
| 
 09.09.2013, 10:51  | 
 5  | 
| 
 			1. функция recv() вернет SOCKET_ERROR — возможно, по истечении таймаута. Какая именно ошибка произошла — можно уточнить функцией WSAGetLastError(). Однако надо учитывать, что в протоколе TCP функция recv() «вынимает» из сокета только те данные, которые реально успели прийти к моменту ее вызова, и ничего не знает о полном размере данных. Тут зависит от того, насколько быстро подсистема TCP зарегистрирует аварийный разрыв соединения. 
 0           | 
| 
 Модератор 3352 / 2127 / 349 Регистрация: 13.01.2012 Сообщений: 8,290  | 
|
| 
 09.09.2013, 11:03  | 
 6  | 
| 
 
 будет тупо ждать данных если программа упала соединение будет разорвано и ОС уведомит об этом отправителя послав ему служебный пакет 
 0           | 
| 
 567 / 198 / 70 Регистрация: 25.05.2012 Сообщений: 816  | 
|
| 
 09.09.2013, 11:22  | 
 7  | 
| 
 
 если программа упала соединение будет разорвано и ОС уведомит об этом отправителя послав ему служебный пакет Это да, я просто не заметил, что в вопросе речь идет именно о падении программы.  
 0           | 
| 
 Модератор 3352 / 2127 / 349 Регистрация: 13.01.2012 Сообщений: 8,290  | 
|
| 
 09.09.2013, 11:40  | 
 8  | 
| 
 
 В случае физического пропадания связи между клиентом и сервером recv не вернет управление думаю не совсем так. я конечно свечку не держал, но… ОС как-то там сама не догадается что шнур перерубили со всеми вытекающими? 
 0           | 
| 
 567 / 198 / 70 Регистрация: 25.05.2012 Сообщений: 816  | 
|
| 
 09.09.2013, 12:10  | 
 9  | 
| 
 
 думаю не совсем так. я конечно свечку не держал, но… ОС как-то там сама не догадается что шнур перерубили со всеми вытекающими? Догадается, но очень не сразу. Уже наступал на эти грабли. 
 0           | 
| 
 2924 / 1273 / 114 Регистрация: 27.05.2008 Сообщений: 3,465  | 
|
| 
 09.09.2013, 12:45  | 
 10  | 
| 
 ОС, конечно же, догадается, что «шнур перерубили», но — спустя таймаут. Не сразу. 
 0           | 

 SOCKET: send(), recv()