Почему этот код не работает в новом файле? - PullRequest
0 голосов
/ 16 сентября 2011

Я написал / нашел скрипт 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?

Ответы [ 2 ]

1 голос
/ 16 сентября 2011

Эти странные y с умлаутами не являются символами ascii:

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

Так что, если вы редактируете такой файл, вы должны быть осторожны, чтобы они были написаны с правильной кодировкой.Таким образом, если исходный файл записан с iso-8859-1, то вы должны убедиться, что ваш status.php также записан с iso-8859-1, а не, например, utf-8.

. Лучшее решениекодировать этот «префикс» с помощью chr, как вы это сделали с chr(0x02).Таким образом вы гарантируете, что ваш редактор не перепутает вещи.

1 голос
/ 16 сентября 2011

Вы используете fwrite, а затем fputs, который является псевдонимом fwrite, поэтому ваш вызов fwrite дважды. используйте его один раз, и вы не получите в два раза больше.

Убедитесь, что вы сохранили файл в правильной кодировке. Попробуйте utf-8.

...