[php] udp open erg traag

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Tom-my
  • Registratie: November 2000
  • Laatst online: 21-05 16:08

Tom-my

w03iz0rz

Topicstarter
Dit is langzaam:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?
$fp = fsockopen("udp://81.23.234.193", 27015, $errno, $errstr,1);
if (!$fp) {
    echo "ERROR: $errno - $errstr<br>\n";
} else {
    fwrite($fp,"ÿÿÿÿplayers\n");
    $data = fread($fp, 2400);
    fclose($fp);
    echo $data;
    echo "<br><hr><br>";
   // ParsePlayerinfo($data);    
}
?>


Ja dit is een php iets om halflife servers te queryen, alleen dit duurt een minuut (ja ik heb getimed) terwijl de server een pingvan 30ms heeft op een ander programma. Wat kan je veranderen om dit sneller te krijgen?

"Then there was the man who drowned crossing a stream with an average depth of six inches."


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 01:47
Ik gok dat de fp-wrapper van PHP probeert je hele buffer (2400 bytes) vol te lezen. Als na een minuut blijkt dat er echt niet meer data komt, breekt 'ie schijnbaar af. Dat is tenminste mijn gok op wat er gebeurd.

Als je de echte socket functies gebruikt, heb je dat probleem niet meer. Dan kun je gewoon precies een pakketje als respons lezen.

offtopic:
Waar heb je trouwens de protocolinformatie vandaan? Ik heb wel eens iets soortgelijks gemaakt, maar dan alleen met een "getinfo" broadcast om te zien welke servers er zoal actief waren.

Acties:
  • 0 Henk 'm!

  • Tom-my
  • Registratie: November 2000
  • Laatst online: 21-05 16:08

Tom-my

w03iz0rz

Topicstarter
www.kquery.com klik daar op developers, en voila ;). Ik heb dit al in delphi gemaakt, zit het nu om te zetten naar php. En tja ik vond het zo focking traag. Wat ik alleen niet snap, die timeout doet neits eigenlijk. Of moet je die zien 'als er geen data komt' -> timeout else -> wachten?

Werkt dit wel voor mij? Ik zat even te denken maar ik gebruik udp packets en geen tcp/ip? Ik hoef niet speciaal een connectie te maken om bij een server te kopen. Enige wat ik zou moeten doen is een bepaald commando sturen naar een ip adres en die rammelt wel terug (hoezo leuk floodmogelijkheid ;)).

Overigens volgende de php manual moet die timeout of die buffer niet compleet vollopen, bij een ef (of als er geen data meer komt) moettie ophouden met prroberen te ontvangen.

[ Voor 48% gewijzigd door Tom-my op 07-08-2003 08:54 ]

"Then there was the man who drowned crossing a stream with an average depth of six inches."


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 01:47
FanToom schreef op 07 August 2003 @ 08:46:
www.kquery.com klik daar op developers, en voila ;).
Mja, ik zocht eigenlijke nette protocol informatie, en geen hele tutorial waar ik de specificatie tussenuit moest vissen. (Dan gebruik ik wel een packet sniffer). Maar toch bedankt.
Ik heb dit al in delphi gemaakt, zit het nu om te zetten naar php. En tja ik vond het zo focking traag. Wat ik alleen niet snap, die timeout doet neits eigenlijk. Of moet je die zien 'als er geen data komt' -> timeout else -> wachten?
[..]
Overigens volgende de php manual moet die timeout of die buffer niet compleet vollopen, bij een ef (of als er geen data meer komt) moettie ophouden met prroberen te ontvangen.
Zoals ik het begrijp, beschouwt PHP alle binnenkomende UDP payload als gegevens op de filestream. Er is met UDP geen expliciete EOF marker (omdat het een connectionless protocol is) dus daarvoor wordt de timeout gebruikt. De lees-operatie probeert de buffer te vullen en wacht dus tot er een timeout komt. Pas dan wordt de onvolledige buffer gerouterneerd.

Om echt een enkel pakketje uit te lezen (wat jij wil) moet je de low level socket functies gebruiken. Ik neem aan dat je die onder Delphi ook gebruikte (maar misschien is daar een high level API beschikbaar), dus dan zou het niet zo moeilijk moeten zijn. Op die URL die jij gaf staat trouwens ook gewoon PHP code; werkt die niet?

Acties:
  • 0 Henk 'm!

  • Tom-my
  • Registratie: November 2000
  • Laatst online: 21-05 16:08

Tom-my

w03iz0rz

Topicstarter
De code die ik zoek staat daar niet tussen idd, en voor delphi heb ik leuke componenten daarvoor.

Overigens kan je ook hier is kijken voor het protocol, overigens heb ik zelf een combinatie gedaan van netwerk verkeer bekijken met ethereal en een blik werpen op die kquery site, gaat erg makkelijk dan met de info die je daarvindt.

http://www.gametiger.net/server-proto.txt

[ Voor 79% gewijzigd door Tom-my op 07-08-2003 16:59 ]

"Then there was the man who drowned crossing a stream with an average depth of six inches."


Acties:
  • 0 Henk 'm!

  • Tom-my
  • Registratie: November 2000
  • Laatst online: 21-05 16:08

Tom-my

w03iz0rz

Topicstarter
oke dit werkt wel snel:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
$fp = fsockopen("udp://211.180.162.2", 27015, $errno, $errstr,0.01);
if (!$fp) {
    echo "ERROR: $errno - $errstr<br>\n";
} else {
    fwrite($fp,"ÿÿÿÿplayers\n");
    stream_set_timeout($fp, 2);
    $data = fread($fp, 2400);
    fclose($fp);
    echo $data;
    echo "<br><hr><br>";
   // ParsePlayerinfo($data);    
}


let op de stream_set_timeout dit did the trick 4 me!

"Then there was the man who drowned crossing a stream with an average depth of six inches."


Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

S Y M P T O O M B E S T R I J D I N G ! ! !

en daarnaast nog extreem fout ook

[ Voor 33% gewijzigd door curry684 op 08-08-2003 09:43 ]

Professionele website nodig?


Acties:
  • 0 Henk 'm!

  • bloody
  • Registratie: Juni 1999
  • Laatst online: 22:02

bloody

0.000 KB!!

kun je geen sockets in non-blocking mode aanmaken??

nope


Acties:
  • 0 Henk 'm!

  • Lord-M
  • Registratie: September 2000
  • Laatst online: 31-07 18:49
Welke versie van PHP gebruik je?

Ik had laatst wat problemen met 4.3.0 waarbij niet alle door de andere partij verstuurde gegevens (IRC server, tcp) ook daadwerkelijk in PHP werden ontvangen. In versie 4.3.2 is dit probleem verdwenen.

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 01:47
Volgens mij had ik het antwoord in de eerste reactie al gegeven, maar goed, als men het topic per se op deze manier wil voortzetten, dan moet het maar.

Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

Soultaker: hij heeft je correcte antwoord compleet verkeerd geimplementeerd, vandaar ook mijn post hierboven :z

Professionele website nodig?


Acties:
  • 0 Henk 'm!

  • nl2dav
  • Registratie: Juni 2001
  • Laatst online: 13-09 14:07
curry684 schreef op 08 August 2003 @ 09:42:
S Y M P T O O M B E S T R I J D I N G ! ! !

en daarnaast nog extreem fout ook
Heeft ie vaker last van ;)
Pagina: 1