为什么此代码无法在新文件中工作?

问题描述:

我写了/发现了一个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的编码问题吗?

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

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

+0

你说得对,当我调用函数时通过'ÿÿÿÿ'作为参数,然后再次运行:check('ÿÿÿÿ',$ ip,$ port)。但我仍然不明白为什么。有没有对此的解释?它必须是某种编码问题...... – andreas

+0

发现我认为的问题,所以我已经更新了我的答案。 – SnatchFrigate

+0

fputs不是问题,但thx!我重读了那个......问题是关于编码。但我认为这个问题已经解决,因为它肯定是一个编码问题。 – andreas

那些奇怪Ÿ与变音符号的非ASCII字符:

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

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

更好的解决方案是用chr编码该“前缀”,就像您使用chr(0x02)一样。这样你就可以确保你的编辑器不会混杂起来。