雖然php中對fsockopen()方法有連線socket的超時引數,但是沒有類似c中的連線成功後對資料的讀寫超時引數設定。沒關係,php中對stream提供了一系列的方法以防止超時
stream_set_blocking( $fp , false )
設定資料流為阻塞模式,以防止資料沒讀完就退出
如果模式為 false, 給定的 socket 描述符將切換到非塊模式, 如果為 true, 則切換到塊模式. 這個效果類似於 fgets() 從 socket 讀的情況. 在非塊模式 fgets() 將會立即返回,而在塊模式將等待資料滿足要求.
stream_set_t $fp , 10 )
設定超時,應該在成功建立連線之後立即加上此句,後面的引數單位為秒
stream_get_meta_data( $fp )
從封裝協議檔案指標中取得報頭/元資料,返回的是乙個陣列,其中格式為:
array
( [stream_type] => tcp_socket
[mode] => r+
[unread_bytes] => 0
[seekable] =>
[timed_out] =>
[blocked] => 1
[eof] =>
)其中索引timed_out為超時資訊,超時則為true,未超時則為false,我們可以籍由此來判斷socket是否超時,需要注意的是此句應該加在每次需要等待的語句之後,比如fwrite(),fread(),並且每讀一次,都要判斷一次是否超時,而對於乙個連線只需一次超時設定stream_set_timeout( $fp , 10 )就可以了
**:$fp = @fsockopen( $ip , $port, $errno , $errstr, 30 );
if( !$fp )
else
//讀取資料
$buf = fread( $fp , 16 ) ;
$sta程式設計客棧tus = stream_get_meta_data( $fp ) ;
//讀取資料超時
if( $status[程式設計客棧'timed_out'] )
}
關於PHP中Socket連線及讀寫資料超時的問題
雖然php中對fsockopen 方法有連線socket的超時引數,但是沒有類似c中的連線成功後對資料的讀寫超時引數設定。沒關係,php中對stream提供了一系列的方法以防止超時 stream set blocking fp false 設定資料流為阻塞模式,以防止資料沒讀完就退出 如果模式為 f...
Socket 讀寫處理及連線斷開的檢測
作為程序間通訊及網路通訊的一種重要技術,在實際的開發中,socket程式設計是經常被用到的。關於socket程式設計的一般步驟,這裡不再贅述,相關資料和文章很多,google baidu即可。本文主要是 如何更好地進行socket讀寫處理,以及如何檢測連線斷開。首先,有以下幾點需要注意 對於全雙工的...
常見socket讀寫異常及錯誤
eagain的錯誤 一般是對非阻塞埠讀寫產生的錯誤。1 傳送產生 傳送緩衝區剩餘空間小於傳送包大小。可以通過修改 tcp sendspace,使之大於send中的size引數 no p o tcp sendspace 65536 2 接收產生 errno 為11,算是異常,等待再次觸發讀取。eint...