Autor Zpráva
Venk85
Profil *
Zdravím,
pracuji na projektu monitorování herních serverů, ale již delší dobu řeším problém. Potřebuji získat informace od serveru kde je například 800 hráčů, jenže do 8192 bajtů se vejde cca 350 hráčů a víc by jich mělo být v nějakém dalším packetu. Na netu jsem žádný podobný problém nenašel, ale informaci o dalším packetu jsem dostal přímo od hlavního vývojáře, takže to musí být nějak podobně.
Zde je můj kód:
public function __construct($ip, $port) {
        $fp=fsockopen("udp://".$ip, $port+123, $errno, $errstr);
        if (!$fp) {
            $this->info["online"] = 0;
        } else {
            stream_set_timeout($fp, 1);
            fwrite($fp, "s");
            echo $data = fread($fp, 8192);
            fclose($fp);
            mtasa::serverProcess($data);
        }
    }
ať přepíšu 8192 na cokoli, vždy je výsledek "ořízlý" do těch 8192 maximálně. Děkuji za každou radu
ShiraNai7
Profil
A co když zkusíš:
echo $data = stream_get_contents($fp);
?
Venk85
Profil *
Stejné, zkoušel jsem i přes while spojovat data po menších částech a nic víc jsem nedostal.


Z dřívější komunikace s vývojářem si matně vzpomínám, že říkal něco o EOF, ale už nevím co.
Majkl578
Profil
Venk85:
Z dřívější komunikace s vývojářem si matně vzpomínám, že říkal něco o EOF, ale už nevím co.
Co to tedy zkusit takhle:
$data = '';
while (!feof($fp)) {
    $data .= fread($fp, 8192);
}
Jan Tvrdík
Profil
Venk85:
Zkus použít PHP rozšíření socket. Viz např. stackoverflow.com/questions/9553516/send-and-receive-udp-from-web-page. Když uvedeš konkrétní IP adresu, tak budu pravděpodobně schopen ti to napsat celé nebo alespoň diagnostikovat, kde přesně je problém.
Venk85
Profil *
Majkl578: To jsem právě také zkoušel

Konkrétní IP je: 94.23.153.11:22003 ,ale momentálně má pouze 300 hráčů online (tak za hodinu by mělo být více)


Port je vlastně 22126 (22003+123)
Jan Tvrdík
Profil
Venk85:
Zkus:
$ip = '94.23.153.11';
$port = 22126;
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_connect($sock, $ip, $port);
socket_write($sock, "s");
$data = socket_read($sock, 100000);
socket_close($sock);
Venk85
Profil *
Jan Tvrdík:
Paráda, zatím to vypadá, že to funguje. Díky moc

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: