Ⅰ php 用CURL 抓取错误提示:Recv failure: Connection was aborted 怎么解决 求助各位大神
一、原因分析
web站点目前主要分为http和https两种协议,其中https类型的网站都是通过ssl协议+http协议的,是目前最安全的网站协议,访问此类网站的时候,会走ssl协议,验证访问者的证书,检测是否安全。
通过curl访问此类网站也是如此流程,但是curl中需要添加相应的参数,绕过ssl证书的验证,才可以正常访问,如出现此错误的一般原因是没有加此参数。
CURLOPT_SSL_VERIFYHOST的值
设为0表示不检查证书
设为1表示检查证书中是否有CN(common name)字段
设为2表示在1的基础上校验当前的域名是否与CN匹配。
二、解决方案
如果出现:
PHP Notice: curl_setopt():
CURLOPT_SSL_VERIFYHOST with value 1 is deprecated and will be removed as of libcurl 7.28.1. It is recommended to use value 2 instead in
一般原因是你设置了 curl_setopt ( $curl_handle, CURLOPT_SSL_VERIFYHOST, true );
改成curl_setopt ( $curl_handle, CURLOPT_SSL_VERIFYHOST, 2 );就行了。
PHP其他原因错误:
1、错误现象
在用curl进行模拟调用时,curl接收内容会出现"Empty reply from server" 和 "Recv failure: Connection was reset"的错误。
2、解决方案
经过对apache的error_log进行跟踪,出现错误"Connection reset by peer: core_output_filter: writing data to the network"
修改httpd.conf,在虚拟主机上添加如下内容:
EnableSendfile off
EnableMMAP off
修改后"Empty reply from server"错误消失。
Ⅱ PHP SOCKET 技术研究
今天试着写一个
PHP
与
C
语言通过socket通讯的程序,看过PHP手册,发现有好几种方式可以建立socket
客户端.
1、通过
fsockopen()
建立socket连接,然后用
用fputs()
发送消息,用
fgets()
接收消息。
2、通过
socket_create()
建立
socket
连接,然后用
socket_send()
or
socket_write()
发送消息,用
socket_recv()
or
socket_read()
发送消息。
很奇怪,我在手册上看到了这样一段话"本扩展模块是实验性的。该模块的行为,包括其函数的名称以及其它任何关于此模块的文档可能会在没有通知的情况下随
PHP
以后的发布而改变。我们提醒您在使用本扩展模块的同时自担风险。"
看来
php4.0
socket通讯还不是完全稳定。
今天我写的客户端要与服务端做两次通讯,我用上面这个方法都写了一个客户端程序,发现当仅仅就一次通讯的时候,也就是PHP客户端发送一次消息,然后接收返回消息,就关闭连接。这两种方法都能正确快速的实现功能,但当做两次通讯时,却有明显的差别,第一种方法第一次通讯特别快就结束了,这个我可以通过服务端的输出看出来,但是第二次通讯要等上好几分钟才能结束,我试了好几次都这样,我不太清楚我的程序哪里出错了,还是这个方式连接就是有问题,但是第二种方法做这两次通讯却很快,正确!完成的非常的。
最后我根据
第二种情况写了一个
class
//////////////////////////////
File
Description
//////////////////////////////////////////
//
Class
Name
:
socket
//
Version
:
V1.0
//
Functional
Outline
:
create
socket,and
send
message
to
server
//
Revision
history
:
2004/12/15
First
version
created
//
Current
:
2004/12/15
Liu
Yongsheng
//////////////////////////////////////////////////////////////////////////////////////////
class
socket{
var
$socket;
//socket
句柄
var
$sendflag
=
">>>";
var
$recvflag
=
"<<<";
var
$response;
var
$debug
=
1;
function
socket($hostname,$port){
$address
=
gethostbyname($hostname);
$this->socket
=
socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
$result
=
socket_connect($this->socket,$address,$port);
if($this->debug
==
1){
if
($result
<
0)
{
echo
"socket_connect()
failed.\nReason:
($result)
"
.
socket_strerror($result)
.
"<br>";
}
else{
echo
"connect
OK.<br>";
}
}
}
function
sendmsg($msg){
socket_write($this->socket,$msg,strlen($msg));
$result
=
socket_read($this->socket,100);
$this->response
=
$result;
if($this->debug
==
1){
printf("<font
color=#CCCCCC>%s
$msg</fon><br>",$this->sendflag);
printf("<font
color=blue>%s
$result</font><br>",$this->recvflag);
}
return
$result;
}
function
close(){
socket_close($this->socket);
}
}
Ⅲ 调用recv函数为何会失败
可能是当前Socket 没有数据到达,按照你上面所说的来推测,估计你使用了非阻塞的recv() ..
Ⅳ send成功 recv失败 有些什么原因
信息不全啊,你是不是用Socket通信啊,send成功是指client端数据发出成功。recv是指server端数据没有接收到啊?如果是这样的话,检查一下数据过滤器吧,有可能是server端数据过滤解析时出问题了。
Ⅳ php中socket_recvfrom
参数不全,该函数原型定义如下
int socket_recvfrom ( resource $socket , string &$buf , int $len , int $flags , string &$name [, int &$port ] )
至少5个参数,而你只给了一个,所以出错了
Ⅵ socket关闭后为什么recv不返回
recv是socket编程中最常用的函数之一,在阻塞状态的recv有时候会返回不同的值,而对于错误值也有相应的错误码,分别对应不同的状态,下面是我针对常见的几种网络状态的简单总结。
首先阻塞接收的recv有时候会返回0,这仅在对端已经关闭TCP连接时才会发生。
而当拔掉设备网线的时候,recv并不会发生变化,仍然阻塞,如果在这个拔网线阶段,socket被关掉了,后果可能就是recv永久的阻塞了。
所以一般对于阻塞的socket都会用setsockopt来设置recv超时。
当超时时间到达后,recv会返回错误,也就是-1,而此时的错误码是EAGAIN或者EWOULDBLOCK,POSIX.1-2001上允许两个任意一个出现都行,所以建议在判断错误码上两个都写上。
如果socket是被对方用linger为0的形式关掉,也就是直接发RST的方式关闭的时候,recv也会返回错误,错误码是ENOENT
还有一种经常在代码中常见的错误码,那就是EINTER,意思是系统在接收的时候因为收到其他中断信号而被迫返回,不算socket故障,应该继续接收。但是这种情况非常难再现,我尝试过一边一直在不停的发信号,一边用recv接收数据,也没有出现过。这种异常错误我附近只有一个朋友在用write的时候见到过一次,但是总是会有概率出现的,所以作为完善的程序必须对此错误进行特殊处理。
一般设置超时的阻塞recv常用的方法都如下:
while(1)
{
cnt = (int)recv(m_socket, pBuf,RECVSIZE, 0);
if( cnt >0 )
{
//正常处理数据
}
else
{
if((cnt<0) &&(errno == EAGAIN||errno == EWOULDBLOCK||errno == EINTR)) //这几种错误码,认为连接是正常的,继续接收
{
continue;//继续接收数据
}
break;//跳出接收循环
}
}
阻塞与非阻塞recv返回值没有区分,都是 <0 出错 =0 连接关闭 >0 接收到数据大小。
Linux环境下,须如下定义:struct timeval timeout = {3,0};
//设置发送超时
setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&timeout,sizeof(struct timeval));
//设置接收超时
setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(struct timeval));
Ⅶ socket 编程 recv问题
在做文件传输吧,要传输的文件路径是否写错了(转义字符)
把代码和错误都贴上来吧
Ⅷ socket recv 的问题
TCP本身提供超时和重传机制,无论多少,要么全部传输到,要么全部都接受不到,不会出现不完整现象。
UDP不太相同。
具体原因:
网络承载的一次传输能力有限,一般为1500个字节,除去IP头部,TCP头或者UDP头部,以太网头,一次传输的数据就以自己使用来说最好不要超过1400个字节。(具有分片能力IP和TCP)
现在拿你的情况来说,比如是2M,如果TCP传输的话,TCP首先会对2M数据分割,使他们成为1500字节/个的包,然后传输到对方机器,对方的TCP会从新组装所有到达的包,然后返回给应用程序。如果中途丢了任何一个包,TCP会负责重传这个包,如果确实无法传到,那么TCP就无法重组完整的数据给应用进程,TCP做法就是不会把任何数据给应用进程,所以TCP就是要么全部到达,要么全部放弃。
UDP不太相同,UDP不支持分片,如果用它传输2M数据,一般的情况是直接报错。当然也有可能的情况是IP层会将UDP的包分片,但IP不保证数据的可靠性,也就是到达对方机器后,很有可能IP层在重组数据(IP分的片,会在IP层重组)失败,一旦无法从组,IP就不会把失败的数据上传给UDP。传输失败。
从这样看来似乎是不会出现不完整的现象,但UDP本身也是为了达到传输目的而存在的,使用UDP的老道的人员都会注意,不会让UDP承载的数据量超过MTU,一般最好别超过1400,因此他们一般做法对于2M数据,自己首先就开始分片,然后再将分好的数据片交由UDP传输,然后再接受方,自己的应用程序重组。所以不完整的现象是自己分的UDP片被丢。
TCP分片和IP分片看上去有点重复,不过实际不是这样,这个就不扯远了。
Ⅸ 为什么我的socket recv()一直等待,接收不到东西
recv本身就是阻塞函数,必须在收到消息之后才能返回,你没收到消息,说明对方没有给你发过来,或者网络故障等等都可能。
不知道你怎么判断服务器有返回数据的,我觉得你需要判断服务器发送是否成功