PHP中Socket連線及讀寫資料超時問題分析

2022-10-05 00:45:23 字數 1064 閱讀 8648

雖然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...