[PHP]Afhandeling udp socket en eventuele timeouts?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben bezig met het maken game Panel, hierop wil ik informatie tonen van verschillende games.

Zoals jullie uiteraard weten verloopt de informatie aanvraag van gameservers via een udp poort. En dus kan men de fsocket functies gebruiken om informatie uit te lezen. Echter heb ik twee vragen over dit onderwerp.

1 Het wordt aangeraden in de php manual dat fread over het netwerk het beste kan verlopen in chuncks. Echter heb ik nu nog het ontwerp dat het per byte/string wordt uitgelezen. Hieronder staan de functies daarvan:
PHP:
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
function getByte() {

        $Result = ord( fread( $this -> Server['Resource'], 1 ) );
        return $Result;

    }

    function getChar() {

        $Result = fread( $this -> Server['Resource'], 1 );
        return $Result;

    }

    function getInt16() {

        $Result = unpack( 'sint', fread( $this -> Server['Resource'], 2 ) );
        return $Result['int'];

    }

    function getInt32() {

        $Result = unpack( 'iint', fread( $this -> Server['Resource'], 4 ) );
        return $Result['int'];

    }

    function getFloat32() {

        $Result = unpack( 'fint', fread( $this -> Server['Resource'], 4 ) );
        return $Result['int'];

    }

    function getString() {

        while ( ( $Byte = fread( $this -> Server['Resource'], 1 ) ) != chr( 0 ) ) {

                $Result .= $Byte;

        }
        return $Result;

    }


Maar wat er nu dus eigenlijk moet gebeuren is dat alle informatie met 1 fread wordt uitgelezen van de server en dat in 1 var te stoppen echter moeten deze functies dan omgeschreven worden dat dit van die var wordt uitgelezen. Hoe kan men dit het beste aanpakken, aangezien het dan geen stream meer is?


2. En mijn tweede vraag gat over timeouts betreffende de UDP aanvragen. Er zijn een aantal functie waarmee een timeout geforceerd kan worden:

* fsockopen ( string target [, int port [, int &errno [, string &errstr [, float timeout]]]] ) door hier de time out in te stellen

* stream_set_timeout ( resource stream, int seconds [, int microseconds] ) door deze in te vullen en op time outs te controleren met bijvoorbeeld een if statement

Echter heb ik gemerkt dat beide oplossing niet echt 100% werken, en check of er enige informatie is opgehaald en daar een timeout op te baseren nog beter werkt. want de boolean stream_set_timout voor de timed_out wordt niet 1 als ik naar een server verwijs die niet bestaat. Wie weet hier een goede oplossing voor?

Acties:
  • 0 Henk 'm!

  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

Op http://nl3.php.net/fsockopen staat het volgende over UDP:
UDP sockets will sometimes appear to have opened without an error, even if the remote host is unreachable. The error will only become apparent when you read or write data to/from the socket. The reason for this is because UDP is a "connectionless" protocol, which means that the operating system does not try to establish a link for the socket until it actually needs to send or receive data.
Blijkbaar werken UDP sockets nog al vaag en moet je maar afwachten of je bij een timeout wel een foutmelding krijgt, of zie ik dat verkeerd?

Sole survivor of the Chicxulub asteroid impact.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
AtleX schreef op zondag 17 juli 2005 @ 16:20:
Op http://nl3.php.net/fsockopen staat het volgende over UDP:

[...]

Blijkbaar werken UDP sockets nog al vaag en moet je maar afwachten of je bij een timeout wel een foutmelding krijgt, of zie ik dat verkeerd?
Maar het moet wel mogelijk zijn vanuit php toch een timeout te veroorzaken, dat udp daar niet opgemaakt is dat begrijp ik want het is bedoeld om snel en ongecontroleerd data te versturen. Php moet toch bijvoorbeeld een timer hebben hoelang die over contact zoeken en informatie binnenhalen mag doen?