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_connect et timeout?


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_connect et timeout?
    Bonjour,

    Alors sur une machine, j'ai des processus qui tournent et communiquent par les port UDP. J'ai fais un script php pour m'y connecte, le voici:
    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
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    <?php
    <?php
    class SocketUdp{
    	public $socket;
    	public $stream;
    	public $buf;
    	public $position;
    	public $connected;
     
    	public $ip;
    	public $data;
    	public $port;
    	public $ipv="ipv4"; // ipv4/ipv6
    	public function __construct($ip, $port, $ipv = NULL) {
    		$this->ip = $ip;
    		$this->port = $port;
    		if(!empty($ipv)){
    			$this->ipv = $ipv;
    		}
    		if(!isset($this->stream)){
    			$this->create();
    			$this->connect();
    			socket_set_block($this->stream);
    			stream_set_timeout($this->stream, 1);
    		}
        }
    	public function send($cmd){
            $packet=socket_write($this->stream, sprintf($cmd, 0x00));
    		echo $packet;
        }
     
        public function connect() {
            $true = socket_connect($this->stream, $this->ip, $this->port);
            if (!$true) {
                echo 'Socket::connect() connection error :(<br />';
    			$this->connected==false;
            }else{
    			// echo "Vous etes connecte au port udp!! <br/>";
    		}
        }
    	public function create() {
            if ($this->ipv == 'ipv4') {
                $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(), $req = NULL){
    		if($this->connected){
    			$rec=socket_recv($this->stream, $this->buf, 1400, MSG_WAITALL);
    			$this->position=4;
    			if($req=='players'){
    				$data->type=$this->get_byte();
    				$data->players=$this->get_byte();
    				if(empty($data->players)){
    					$data->players=0;
    				}else{
    					for($i=1; $i<=$data->players; $i++){
    						$this->get_byte();
    						$data->nom[]=$this->get_string();
    						$data->kill[]=$this->get_long();
    						$data->temps[]=$this->get_float();
    					}
    				}	
    			}
    				foreach($vars as $k=>$v){
    					$f="get_".$v;
    					$data->$k = self::$f();
    				}
    				return $data;
    		}
    	}
    	public function get_byte(){
    		$data = substr($this->buf, $this->position, 1);
    		$data = unpack('cvalue', $data);
    		$this->position+=1;
            return $data['value'];
    	}
        public function get_long() {
            $data = substr($this->buf, $this->position, 4);
            $data = unpack('lvalue', $data);
    		$this->position+=4;
            return $data['value'];
        }
     
    	public function get_string(){
    		$str = null;
    		while(($char = $this->get_char()) != chr(0)){
    			$str .= $char;
    		}
    		return $str;
    	}
    	public function get_char(){
    		$char=substr($this->buf, $this->position, 1);
    		$this->position+=1;
    		return $char;
    	}
        public function get_short() {
            $data = substr($this->buf, $this->position, 2);
            $data = unpack('svalue', $data);
    		$this->position+=2;
            return $data['value'];
        }
        public function get_float() {
            $data = substr($this->buf, $this->position, 4);
            $data = unpack('fvalue', $data);
    		$this->position+=4;
            return $data['value'];
        }
     
     
    }
    ?>
    Imaginons qu'un des processus plante, j'ai un soucis avec le timeout qui ne fonctionne pas, il reste a 30 sec. Donc je le vois dans apache.log
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    [Thu Nov 01 15:08:47 2012] [error] [client 192.168.0.83] PHP Warning:  stream_set_timeout(): supplied resource is not a valid stream resource in /var/www/webroot/includes/gquery/socketudp.php on line 23, referer: http://192.168.0.50/pag$
    [Thu Nov 01 15:09:17 2012] [error] [client 192.168.0.83] PHP Fatal error:  Maximum execution time of 30 seconds exceeded in /var/www/webroot/includes/gquery/socketudp.php on line 92, referer: http://192.168.0.50/pages/view/Accueil
    Donc si il plante je peux pas fermer le port par iptables, si l'utilisateur ferme le processus d'une autre manière que le site, je ne peux pas non plus le détecter =>Pas de possibilité de le voir au socket_connect, enfin je crois pas. Donc j'aurais aimé savoir si vous saviez comment détecter que mon processus ne tourne pas. J'aurais bien aimé avoir quelque chose de propre si possible mais j'en suis incapable vu que je n'arrive pas du tout a faire marcher ce script :/.

    Est ce que quelqu'un peut m'aider s'il vous plait?

  2. #2
    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
    Je me permet de faire un petit up.. désolé

  3. #3
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Tu peux définir un timeout de lecture et d'écriture avec socket_set_option

    Voir un exemple dans la méthode connect de la classe suivante : https://github.com/grunk/Pry/blob/ma...cket.class.php

    Pour la connexion ca se passe dans le php.ini , par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ini_set('default_socket_timeout', 5);
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. [TOMCAT] Problème de timeout d'une servlet
    Par tuxor dans le forum Tomcat et TomEE
    Réponses: 5
    Dernier message: 18/09/2007, 12h04
  2. Alter Session : question de TimeOut
    Par Filippo dans le forum Administration
    Réponses: 4
    Dernier message: 13/05/2004, 17h42
  3. [JSP]recuperer session-timeout dans web.xml
    Par seb_fou dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 07/05/2004, 16h01
  4. [Sockets] Timeout sur accept() ?
    Par MikB dans le forum Développement
    Réponses: 2
    Dernier message: 30/12/2003, 17h22
  5. Ftp login & Timeout
    Par MSP dans le forum Modules
    Réponses: 6
    Dernier message: 29/08/2003, 12h55

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