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]=> ........ }

我想:让我们正确地把它包装成这样的函数(所有代码都保持不变,除了开始和结束行)。只要它保留在同一个文件中,这仍然有效。但我想我可以把函数“check”放到一个新文件中,然后我得到这个结果:

**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

您使用 fwrite 然后 fputs 是 fwrite 的别名,因此您调用 fwrite 两次。使用一次,你不会得到两倍的输出。

确保以正确的编码保存文件。试试 utf-8。

于 2011-09-16T11:24:01.653 回答
1

那些带有变音符号的奇怪 y 是非 ASCII 字符:

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

因此,如果您编辑这样的文件,您必须小心这些文件是用正确的编码编写的。因此,如果原始文件是用iso-8859-1then 编写的,那么您必须确保您status.php的文件也是用iso-8859-1而不是编写的,例如utf-8.

更好的解决方案是chr像使用chr(0x02). 这样你就可以确保你的编辑器不会混淆。

于 2011-09-16T11:38:07.403 回答