2010-11-15 6 views
0

J'essaie de me connecter à un serveur de jeu pour obtenir l'état du serveur. En regardant la connexion avec Wireshark, les choses devraient fonctionner. Malheureusement, lorsque j'utilise fsockopen(), le texte est altéré par des points d'interrogation et des caractères inconnus. Dans certains endroits, le texte est correct, alors je sais que je me connecte et que je reçois des données.php fsockopen() résultats étranges codage de caractères

Quelle devrait être ma prochaine étape pour que cela fonctionne? Je pense peut-être à un tampon ou quelque chose comme ça, mais c'est vraiment un seul paquet que je reçois.

code PHP:

<?php 
//$fp = fsockopen("udp://173.199.102.29", 3074, $errno, $errstr); 
$fp = fsockopen("udp://209.247.83.157", 3074, $errno, $errstr); 
if (!$fp) { 
    echo "ERROR: $errno - $errstr<br />\n"; 
} else { 
    fwrite($fp, "\xff\xff\xff\xff\x00 playerlist\x00"); 
    stream_set_timeout($fp, 4); 
    stream_set_blocking($fp, 1); 
    $s=""; 
    do { 
       $read = fread($fp,1024); 
         //$s .= $read; 
         $s .= $read; 
         $info = stream_get_meta_data($fp); 
       } 
       while (!$info["timed_out"]); 
echo $s; 
    fclose($fp); 
} 
?> 

résultats:

-ÿÿÿÿ ����������������������������������������������������������������������������������������������������������������������������������������� á������������������������������������������������������������˜Ÿw´à�†w3†w׬«I��� á�­‡w����������������˜Ÿw��˜wtà�‹���å�ÝŸwÜà�Š–��������Øà�ª–�á�Ø>«�à/ã–�[ã�ûÿÿÿlã�@+–�����@(Œ@(ŒÌ+–�n���/$–��������Ì+–�?‹w����Ø>«�à/Ð/x,wã�������������Ë¢���������������������ä����[ã�ûÿÿÿ���@�������«æ�����?����������������������������"B��ÿÿ��µ…_�#�\pæ�+��������uží?�����:¯÷¿���������€���Ð��������Àñ}šw™”Ÿwòßšw¨”Ÿw㨫I*���*���û������+���S���+���+����¸¸�¸�������Tä�¤ä�'·)w#�����Tä�+���˜`«(ˆ`«(°ç�k��¸)w¦(šw¬ä�ÿÿ��+���S�ž+�ý~+���������������������������Àä�ãb,w#�����´ä�+���������ÀñÀ�����������������������������€@���������øÿÿÿ›À��������������������������������������������������������������������������������������������������������€¿�������������������������������56227��������k]D’°ã��g•�ã�Ë¢�����ìã�@(Œ@���%WÇS(Œ,���@(ŒB���%WÇG(Œ8���@(ŒÌã�@g•�@(Œ@���Ë¢�����ìã�����ôi�@(Œ@���Ë¢�ìã�FP_�Ë¢�F���N���Ø���ç���£Û�����¾\’úS^� 

Contenu du paquet je recevrais (De Wireshark):

.....M.ML. .U\protocol\1044\clients\15\sv_maxclients\18\pure\1\hc\1\hw\2\mod\0\voice\1\pb\1\bots\0\licensetype\2\wager\0\geolocation\SEA\playlist\10......M.ML. .U.....M.ML. .U\protocol\1044\clients\15\sv_maxclients\18\pure\1\hc\1\hw\2\mod\0\voice\1\pb\1\bots\0\licensetype\2\wager\0\geolocation\SEA\playlist\10 
+0

Le serveur utilise-t-il des codes ASCII 7 bits ISO-8859-1? – stillstanding

+0

J'ai essayé de convertir entre quelques uns différents. Je ne suis pas vraiment sûr, je ne le change jamais. – WalterJ89

+0

quelle que soit l'entrée doit être ascii – WalterJ89

Répondre

0

Cela n'aborde pas directement le problème de perte de caractères, mais votre code boucle jusqu'à ce qu'il expire - même si le serveur ne reçoit plus de données. Utilisez-le à la place:

$s=''; 
$info=stream_get_meta_data($fp); 
while (!feof($fp) && !$info['timed_out']) { 
    $s.=fgets($fp,1024); 
    $info=stream_get_meta_data($fp); 
} 
echo $s;