IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Socket_read, write, comment bien s'en servir?


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 99
    Points : 55
    Points
    55
    Par défaut Socket_read, write, comment bien s'en servir?
    Bonjour,

    J'ai un soucis avec mon code, je n'arrive pas a utiliser socket_read. Dès que je fais appel a cette fonction mon navigateur tourne en round, la page se charge indéfiniment. Voilà mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    <?php
    class GoldSrcQuery{
    	const Q_HEADER = "\xFF\xFF\xFF\xFF"; //0xFFFFFFFF;
    	const A2A_PING = "\x69"; //0x69;
    	const A2S_INFO = "TSource Engine Query\0";
    	const A2S_PLAYER = "\x55"; //0x55;
    	const A2S_RULES = "\x56"; //0x56;
    	const A2S_SERVERQUERY_GETCHALLENGE = "\xFF\xFF\xFF\xFF\x57"; // challenge 
     
    	public $socket;
    	public $latence;
    	public $connected; 
    	public function __construct($ip, $port, $ip6 = false) {
    		$this->socket = new SocketUdp($ip, $port, $ip6);
    	}	
        public function getChallenge() {
    		$this->socket->send(self::Q_HEADER.self::A2S_SERVERQUERY_GETCHALLENGE);
    		$vars=array('byte', 'long');
    		$r = $this->socket->read($vars);
        }
     
    }
    class SocketUdp{
    	public $socket;
    	public $stream;
     
    	public $ip;
    	public $port;
    	public $ipv="ipv4"; // ipv4/ipv6
    	public function __construct($ip, $port, $ip6 = false) {
    		$this->ip = $ip;
    		$this->port = $port;
    		$this->ip6 = $ip6;
    		if(!isset($this->stream)){
    			$this->create();
    			$this->connect();
    			socket_set_block($this->stream);
    		}
    		print_r($this);
        }
    	public function send($cmd){
            $packet=socket_write($this->stream, $cmd);
    		echo $packet;
        }
     
        public function connect() {
            $true = socket_connect($this->stream, $this->ip, $this->port);
            if (!$true) {
                echo 'Socket::connect() connection error :(<br />';
            }else{
    			echo "Vous etes connecte au port udp!! <br/>";
    		}
        }
        public function create() {
            if ($this->ip6 === false) {
                $this->stream = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
            }else{
                $this->stream = socket_create(AF_INET6, SOCK_DGRAM, SOL_UDP);
            }
            if ($this->stream === false) {
                trigger_error('SocketUDP::create init error :(');
            }
        }
        public function read($vars = array()){
    		$data = socket_read($this->stream, 1);
    		return $data;
    	}
    }
    ?>
    Voilà et donc dès que je crée un objet GoldSrcQuery, et que j'utilise la fonction getChallenge, sa bug..

    Est ce que quelqu'un peut me dire pourquoi s'il vous plait?

    Sinon deuxième question, j'ai vu que l'on pouvait également se servir de fsockopen, qu'en pensez vous? Est-ce qu'il existe encore d'autres alternative a ces méthodes?

  2. #2
    Membre expérimenté
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 013
    Points : 1 381
    Points
    1 381
    Par défaut
    Tu as défini ta socket comme étant bloquante, ce qui veut dire que tant que des données ne sont pas reçues, l'exécution va être suspendue. Si cela te convient mieux, tu peux passer la socket en mode non bloquant avec la fonction socket_set_nonblock
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php
    $socket = socket_create_listen(1223);
    socket_set_nonblock($socket);
     
    socket_accept($socket);
    ?>

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 99
    Points : 55
    Points
    55
    Par défaut Re
    Effectivement, en faisant comme sa, ma page n'est plus freeze mais par contre je ne reçois rien dans le socket_read. Je suppose donc que c'est a cause de cette ligne?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    socket_write($this->stream, sprintf($cmd, 0x00));

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 99
    Points : 55
    Points
    55
    Par défaut Re
    Merci, sa m'a bien aidé. Donc du coups après quelques recherche la const A2S_SERVERQUERY_GETCHALLENGE n'est pas égale à \xFF\xFF\xFF\xFF\x57 mais a \x55\xFF\xFF\xFF\xFF. Donc my bad ^^. Merci en tout cas pour l'aiden sinon j'aurais mis du temps a comprendre.


    Par contre il me reste un point a éclaircir avec socket_read. Si je veux une décomposition de ma réponse, j'imaginais que l'on pouvait faire quelque chose du genre $data=socket_read($this->stream, 2); puis un $data2=socket_read($this->stream, 2);, mais apparemment sa freeze également quand je fais ce genre de chose. Il faut que je stock toute la réponse, puis que je la découpe?

  5. #5
    Membre expérimenté
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 013
    Points : 1 381
    Points
    1 381
    Par défaut
    Je pense qu'une meilleure solution serait de faire un $data=socket_read($this->stream, 4); puis de traiter les données dans $data. (donc oui pour ta question)

  6. #6
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 99
    Points : 55
    Points
    55
    Par défaut Re
    D'accord, merci pour ton aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment bien déboguer son code ?
    Par D[r]eadLock dans le forum Débuter
    Réponses: 47
    Dernier message: 02/04/2024, 16h06
  2. [GANT]Comment bien me servir de mon soft ?
    Par student_php dans le forum Méthodes
    Réponses: 7
    Dernier message: 29/02/2012, 15h30
  3. [Optimisation] Comment bien utiliser le StringBuffer?
    Par mathieu dans le forum Langage
    Réponses: 4
    Dernier message: 17/05/2004, 14h22
  4. Comment bien utiliser ce forum ?
    Par Alcatîz dans le forum Pascal
    Réponses: 0
    Dernier message: 21/04/2004, 16h37
  5. Comment bien gerer la mémoire avec les TStringList?
    Par david_chardonnet dans le forum Langage
    Réponses: 5
    Dernier message: 18/06/2003, 09h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo