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のエンコーディングの問題ですか?

4

2 に答える 2

1

ウムラウトを含むこれらの奇妙なyは、ASCII以外の文字です。

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

したがって、そのようなファイルを編集する場合は、それらが正しいエンコーディングで書き込まれるように注意する必要があります。したがって、元のファイルがで書き込まれている場合は、たとえば、で書き込まれているiso-8859-1ことを確認する必要があります。status.phpiso-8859-1utf-8

chrより良い解決策は、で行ったようにその「プレフィックス」をエンコードすることですchr(0x02)。そうすることで、エディターが混乱しないようにすることができます。

于 2011-09-16T11:38:07.403 に答える
1

fwriteを使用してから、fwriteのエイリアスであるfputsを使用するため、fwriteを2回呼び出します。1回使用すると、2倍の出力が得られません。

ファイルを正しいエンコーディングで保存してください。utf-8を試してください。

于 2011-09-16T11:24:01.653 に答える