2011-09-16 85 views
0

我寫了/發現了一個php腳本,我不明白它爲什麼有一次工作,而另一次沒有。該腳本連接到遊戲服務器,並試圖從它那裏得到信息:爲什麼此代碼無法在新文件中工作?

$ip = 'MyServer'; 
$port = 'OurPort'; 
$connect_ip = "udp://" . $ip; 
$connect = fsockopen($connect_ip, $port, $errno, $errstr, 30);  
socket_set_timeout ($connect, 1, 000000);  
$send = "ÿÿÿÿ" . chr (0x02) . "getstatus"; 
fputs($connect, $send);   
fwrite ($connect, $send);  
$output = fread($connect, 1); 
if(!empty($output)) { 
    do { 
     $status_pre = socket_get_status($connect); 
     $output = $output . fread($connect, 1); 
     $status_post = socket_get_status($connect); 
    } while ($status_pre['unread_bytes'] != $status_post['unread_bytes']); 
}; 
$output = explode ('\\', $output); 

var_dump($output); 

輸出工作,是這樣的:

array(149) { [0]=> string(20) "ÿÿÿÿstatusResponse " [1]=> ........ } 

我想:讓我們做正確,它包裝成一個功能像這樣(所有代碼保持不變,除了開始和結束行)。這將仍然工作,只要它停留在同一個文件中。但我想我可以把功能「檢查」到一個新的文件,然後我得到這個結果:

**status.php** 
function check($ip, $port) { 

$connect_ip = "udp://" . $ip; 
$connect = fsockopen($connect_ip, $port, $errno, $errstr, 30);  
socket_set_timeout ($connect, 1, 000000);  
$send = "ÿÿÿÿ" . chr (0x02) . "getstatus"; 
fputs($connect, $send);   
fwrite ($connect, $send);  
$output = fread($connect, 1); 
if(!empty($output)) { 
    do { 
     $status_pre = socket_get_status($connect); 
     $output = $output . fread($connect, 1); 
     $status_post = socket_get_status($connect); 
    } while ($status_pre['unread_bytes'] != $status_post['unread_bytes']); 
}; 
$output = explode ('\\', $output); 

var_dump($output); 

} 


**index.php** 
include('status.php'); 
check('MyServer', 'OurPort') 

但猜猜是什麼?輸出是現在:

array(1) { [0]=> string(30) "ÿÿÿÿdisconnectÿÿÿÿdisconnect" } 

這怎麼可能?我在這裏監督什麼?這是奇怪的y的編碼問題嗎?

回答

1

你使用fwrite然後fputs是fwrite的別名,所以你調用fwrite兩次。使用它一次,你不會得到兩倍的輸出。

請確保以正確的編碼保存文件。試試utf-8。

+0

你說得對,當我調用函數時通過'ÿÿÿÿ'作爲參數,然後再次運行:check('ÿÿÿÿ',$ ip,$ port)。但我仍然不明白爲什麼。有沒有對此的解釋?它必須是某種編碼問題...... – andreas

+0

發現我認爲的問題,所以我已經更新了我的答案。 – SnatchFrigate

+0

fputs不是問題,但thx!我重讀了那個......問題是關於編碼。但我認爲這個問題已經解決,因爲它肯定是一個編碼問題。 – andreas

1

那些奇怪Ÿ與變音符號的非ASCII字符:

$send = "ÿÿÿÿ" . chr (0x02) . "getstatus"; 

所以,如果你編輯你必須要小心,這些都與正確的編碼寫的這樣的文件。所以如果原始文件是用iso-8859-1寫的,那麼你必須確保你的status.php也是用iso-8859-1寫的,而不是,例如utf-8

更好的解決方案是用chr編碼該「前綴」,就像您使用chr(0x02)一樣。這樣你就可以確保你的編輯器不會混雜起來。

相關問題