[PHP] UDP pakketjes

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Turbo_boy
  • Registratie: Oktober 2003
  • Laatst online: 01-03-2024
Hallo allemaal.

Ik ben op het moment bezig met een soort van battlefield 2 tracking site maken,
maar nu loop ik tegen het volgende probleem aan.

De informatie verkrijgen gaat wel goed, tot hij op het 2de UDP pakketje stopt.

De bf2 server stuurd ongeveer 2 a 3 UDP pakketjes terug.

Nu was mijn vraag, hoe kan ik deze 2 en 3de pakketje uitlezen?
Ik kan het eerst dus wel gewoon uitlezen, hier staat de server info enz. in
maar ik wil ook de player statistieken hebben.

Ik weet dat er een bf2tracking site is, maar ik zou het graag via mijn eigen
php script willen.

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Waarom stopt hij op het tweede pakketje? Welke manier gebruik je om de socket uit te lezen, en wat voor error krijg je daarbij?

[ Voor 2% gewijzigd door GlowMouse op 07-05-2006 19:14 . Reden: typo ]


Acties:
  • 0 Henk 'm!

  • Thralas
  • Registratie: December 2002
  • Laatst online: 15:46
Ik neem aan dat je fsockopen/fread/fwrite gebruikt, je loopt fread() toch wel? Je krijgt vrijwel zeker niet alles uitgelezen in één call naar fread.

Acties:
  • 0 Henk 'm!

  • Turbo_boy
  • Registratie: Oktober 2003
  • Laatst online: 01-03-2024
fread($game_con, 4);
$status = socket_get_status($game_con);
if ($status["unread_bytes"] == 0) {
echo "Server $game $ip:$nPort is down";
die();
}
$sock_read = "";
do {
$sock_read .= fread($game_con, 1);
$status = socket_get_status($game_con);
}
while ($status["unread_bytes"] != 0);
fclose($game_con);

Dit gebruik ik tot nu toe om alles uit te lezen

Acties:
  • 0 Henk 'm!

  • Thralas
  • Registratie: December 2002
  • Laatst online: 15:46
Zet je code voortaan even tussen [code=php][/code] tags

Verder zie ik dat je fread() aanroept zolang $status["unread_bytes"] NIET 0 is. Op PHP.net staat het volgende:
unread_bytes (int) - the number of bytes currently contained in the PHP's own internal buffer.

Note: You shouldn't use this value in a script.
Naast die note zou het dus betekenen dat, dat die variable 0 is op het moment dat er even geen data beschikbaar is. Waarschijnlijk zit er een vertraging tussen de packets waardoor unread_bytes even 0 is, maar daarna weer nonzero is omdat de volgende packet is aangekomen. Waarschijnlijk kun je beter door blijven loopen tot je aan EOF zit (feof(), treedt alleen op bij een closed connection voor zover ik weet), of totdat je alle data hebt die je nodig hebt en zelf de socket dichtgooit met fclose().

[ Voor 5% gewijzigd door Thralas op 07-05-2006 19:41 ]


Acties:
  • 0 Henk 'm!

  • Spleasure
  • Registratie: Juli 2001
  • Laatst online: 13-08 08:13

Spleasure

Ik hier?

Je kunt idd beter aan de data zelf bepalen of je klaar bent.

Acties:
  • 0 Henk 'm!

  • Turbo_boy
  • Registratie: Oktober 2003
  • Laatst online: 01-03-2024
dus nu moet ik gewoon dit vervangen als het ware?

while ($status['unread_bytes']);

naar:
while (feof($game_con));

??

Sorry ben niet zoveel bekent met het socket gebeuren

Acties:
  • 0 Henk 'm!

  • Thralas
  • Registratie: December 2002
  • Laatst online: 15:46
Dan zou je natuurlijk even de manual pagina kunnen lezen om er wat meer bekend mee te raken. Over het algemeen is de PHP manual erg duidelijk. Ook kun je op de page van fsockopen wat mooie voorbeeldjes vinden, ook feof() komt er in voor. Wel zou ik in ieder geval !feof($game_con) gebruiken, omdat je juist wilt loopen zolang er sprake is van een verbinding met de server. feof() returned pas true zodra dat het geval is. Je voorbeelde zal dan ook de hele while-lus overslaan omdat de verbinding nog steeds actief is.

Acties:
  • 0 Henk 'm!

  • Turbo_boy
  • Registratie: Oktober 2003
  • Laatst online: 01-03-2024
Ik ben even gaan prutsen, want ik ben ook een irc scripter.

Maar irc bleek ook maar 1 udp pakketje binnen te krijgen, ik ben gaan kijken
hoe dit kwam en kwam er dus achter dat ik 3x fwrite met verschillende requests moest sturen.

Maar nu krijg ik wel alles binnen, maar nu blijft hij in een oneindige loop zitten. Ik krijg dus geen eof binnen. Terwijl ik al wel alle data binnen heb.

Acties:
  • 0 Henk 'm!

  • Thralas
  • Registratie: December 2002
  • Laatst online: 15:46
En dat hoort ook zo, bij IRC wil je toch ook niet dat de verbinding verbroken wordt als je eenmaal ingelogd bent en nog geen channel gejoined bent of iets dergelijks? Mocht de server de verbinding verbreken dan returned feof() true, en anders kun je om uit de loop te komen gewoon de verbinding verbreken met fclose($game_con) en uit de loop break'en zodra je alles hebt wat je nodig hebt?
In het geval van IRC wil je waarschijnlijk eerst nog even QUIT sturen, maar dat terzijde

[ Voor 3% gewijzigd door Thralas op 07-05-2006 20:50 ]


Acties:
  • 0 Henk 'm!

  • Turbo_boy
  • Registratie: Oktober 2003
  • Laatst online: 01-03-2024
tja het van irc bedoelde ik het sockudp gedeelte hoor niet het connecten naar server enz. ;-)

irc gebruik ik regelmatig om dingen te achterhalen wat ik zoal binnen krijg als ik iets stuur ;-)
maar goed. Ik zal is even verder puzzelen hoe ik dus ga controleren dat hij alles binnen heeft enz.

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Turbo_boy schreef op zondag 07 mei 2006 @ 20:57:
tja het van irc bedoelde ik het sockudp gedeelte hoor niet het connecten naar server enz. ;-)

irc gebruik ik regelmatig om dingen te achterhalen wat ik zoal binnen krijg als ik iets stuur ;-)
maar goed. Ik zal is even verder puzzelen hoe ik dus ga controleren dat hij alles binnen heeft enz.
Jij hebt het over het socket-gedeelte van mIRC-scripting. IRC zelfs heeft niks met UDP te maken.
Pagina: 1