Ⅰ 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本身就是阻塞函數,必須在收到消息之後才能返回,你沒收到消息,說明對方沒有給你發過來,或者網路故障等等都可能。
不知道你怎麼判斷伺服器有返回數據的,我覺得你需要判斷伺服器發送是否成功