Page 1 sur 1

Socket, accès multiple refusé...

Posté : 10 sept. 2009, 13:43
par jojolapine
Bonjour à tous,
Je m'essaye à faire un petit script de chat via les socket et ajax (un serveur, des listeners, etc...)
ça fonctionne plutôt bien en local, seulement sur mon serveur, je ne peux à priori pas dépasser une connection sur le même socket...
En gros la première connection sur le socket (quelque soit l'ordre d'appel des script semble fonctionner, mais celle d'après sont refusées...
Donc vers quelles option de configurations faut-il que j'aille fouiner...?

Je vous metterais le code si besoin, mais il est un peu compliqué pour l'instant si le seul problème viens de la configuration ;)

Merci d'avance!

Re: Socket, accès multiple refusé...

Posté : 10 sept. 2009, 13:56
par Dr@ke
Sur le Port HTTP?
Tu parles de connexions avec la même IP?
Sinon sous linux, il y a , je croie, dans inetd, des paramètres pour le nombre maximum de connexions...

[EDIT]
Question:
Je suis entrain de développer un petit programme qui contient un "chat" le
problème c'est que je ne suis pas capable de connecter plus d'un client au
serveur lorsque le second client essaie de ce connecter et bien le serveur
le refuse
Réponse:
quand tu ouvres une connexion sur un port ça crée un canal de communication
entre le client et le serveur.
du coup c'est normal que les autres clients ne peuvent plus se connecter.
le principe pour le serveur est d'avoir un port d'écoute.
quand il a une demande de connexion de la part d'un client il créée la
connexion pour le "chat" sur un autre port
afin de libérer son port d'écoute.
Le serveur dispose donc d'un port "d'écoute" connu par tout les clients,
puis d'une plage de port avec laquelle il fera effectivement les connexions
"applicative"

Re: Socket, accès multiple refusé...

Posté : 10 sept. 2009, 15:04
par jojolapine
Pour les test, je me connecte effectivement depuis la même IP, mais ça ne devrait pas changer grand chose...
Pour infos j'ai essayer différentes config:

Code : Tout sélectionner

nomdedomaine.fr http://nomdedomaine.fr xxx.xxx.xxx.xxx http://xxx.xxx.xxx.xxx
Seul l'IP toute seule ou le nom de domaine tout seul semble fonctionner pour la première connection, mais les suivantes sont refusée...
J'ai toujours le droit à ceci:
<b>Warning</b>: socket_connect() [<a href='function.socket-connect'>function.socket-connect</a>]: unable to connect [111]: Connection refused in <b>chat/send.php</b> on line <b>14</b><br />
Connection refused

Re: Socket, accès multiple refusé...

Posté : 10 sept. 2009, 15:43
par Sékiltoyai
Le code des deux programmes ?

Re: Socket, accès multiple refusé...

Posté : 10 sept. 2009, 15:59
par FuZZyLine
Salut tout seul,
Bonjour à tous,
Je m'essaye à faire un petit script de chat via les socket et ajax (un serveur, des listeners, etc...)
ça fonctionne plutôt bien en local, seulement sur mon serveur, je ne peux à priori pas dépasser une connection sur le même socket...
En gros la première connection sur le socket (quelque soit l'ordre d'appel des script semble fonctionner, mais celle d'après sont refusées...
Donc vers quelles option de configurations faut-il que j'aille fouiner...?
Je vous metterais le code si besoin, mais il est un peu compliqué pour l'instant si le seul problème viens de la configuration ;)
Merci d'avance!
Pardonne ces quelques questions débiles mais...

As-tu essayé de changer le type socket? (bloquantes -> no bloquante)
As-tu vidé ton stream?
Peux-tu faire des essais en utilisant un client qui ne soit pas sur le même PC que le serveur?
Par la même, les clients qui ne soient pas sur le même PC?

Dans le message d'erreur on dirait qu'il arrive au max de connexions autorisées... bizarre ;)

...En sus (celle-ci est vraiment stupide, désolé) Lors du bind, le serveur accete t'il bien la connexion?

Voili, voilou, et désolé encore pour toutes les questions mais j'avoue que le sujet s'y prete lol

@+ ;)

Re: Socket, accès multiple refusé...

Posté : 10 sept. 2009, 16:57
par jojolapine
Bonjour,
Il n'y a pas de questions débiles, surtout que je commence à peine à tremper les pieds dans les sockets, donc je ne maitrise vraiment pas grand chose (pour pas dire rien :p )
Donc pour les codes, voici ce que ça donne:
serveur.php:
<pre>
<?php
set_time_limit(0);

require_once('./config.php');

//On crée notre classe
class Chat_Server
{       
var $socket=NULL;
var $client=NULL;

//Méthode qui démarre le serveur
function Start($adresse,$port)
        {
        echo"Lancement du serveur...\n";
        $this->clients=array();

        //Création de la socket
        @$this->socket = socket_create(AF_INET, SOCK_STREAM, 0);
        
        if($this->socket===false){
          die(socket_strerror(socket_last_error()));
        }
        
        //on lie la ressource sur laquelle le serveur va écouter
        @$bind=socket_bind($this->socket, $adresse, $port);
        
        if($bind===false){
          die(socket_strerror(socket_last_error()));
        }
        
        
        //On prépare l'écoute
        @$listen=socket_listen($this->socket);
        
        if($listen===false){
          die(socket_strerror(socket_last_error()));
        }
        //Boucle infinie, car le serveur ne doit s'arrêter que si on lui demande
        while(true)
                {
                //Le code se bloque jusqu'à ce qu'une nouvelle connexion client soit établie
                $this->client = socket_accept($this->socket);
                
                 if($this->client===false){
                    die(socket_strerror(socket_last_error()));
                  }
                
                //Cette méthode lit les données reçues par un client, et les redistribue
                $reception = socket_read($this->client , 255);
                
                 if($reception===false){
                  die(socket_strerror(socket_last_error()));
                }
                
                
                $pseudo = substr($reception , 0 , strpos($reception , ' '));
                $message = substr($reception , strpos($reception , ' ')+1 , strlen($reception));
                //Le message est "/connect", donc on stocke la socket dans le tableau
                if($message == "/connect")
                        {
                        $this->clients[$pseudo]=$this->client;
                        echo "$pseudo connected\n";
                        }
                elseif($message == "/exit")
                        {
                          unset($this->clients[$pseudo]);
                          echo $pseudo." away!\n";
                        }
                elseif($message == "/close")
                        {
                          $this->close();
                        }
                //C'est donc un message : ici on va envoyer le message vers chacun des clients
                else
                        {
                        echo "Pseudo: [".$pseudo."] Message recu: [".$message."] Message envoye a : ";
                        //On passe chaque case du tableau = chaque client, et on lui envoie le message
                        foreach( $this->clients as $nom_case => $socket_en_cours)
                                {
                                //Si ça ne marche pas, c'est qu'il est déconnecté
                                if(@socket_write($socket_en_cours, $reception, strlen($reception)) === false)
                                        {
                                        //La socket est enlevée du tableau
                                        unset($this->clients[$nom_case]);
                                        echo "[$nom_case s'est deconnecte]";
                                        }
                                else
                                        echo "$nom_case ";
                                }
                        //On ferme la socket qui vient de nous apporter un message
                        socket_close($this->client);
                        echo"\n";
                        flush();
                        }
                }
        }
  function close(){
    if($this->socket!==NULL){
      socket_close($this->socket);
      echo "Shuting down!\n";
    }
    else {
      echo "No ressources find!\n";
    }
    exit();
  }
}

  
$chat = new Chat_Server();

if(isset($_GET['close']) && $_GET['close']=='1'){
  $chat->close();
}
else {
  $chat->Start($address,$port);
}
?>
</pre>
send.php:
<?php   
require_once('./config.php');

if(!empty($_POST['message']))
        {
        //Création de la socket
        $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
        
        if($socket===false){
          die(socket_strerror(socket_last_error()));
        }
        
        //Connexion au serveur
        $connect=socket_connect($socket,$address,$port);
        
        if($connect===false){
          die(socket_strerror(socket_last_error()));
        }
        
        //Construction du paquet à envoyer au serveur
        $paquet=str_replace(' ' , '&nbsp;' ,$_POST['pseudo']).' '.$_POST['message'];
        //Ecriture du paquet vers le serveur
        $write=socket_write($socket,$paquet,strlen($paquet));
        
        if($write===false){
          die(socket_strerror(socket_last_error()));
        }
        
        //Fermeture de la connexion
        socket_close($socket);
        }
?>
et reception.php:
<?php
set_time_limit(0);

require_once('./config.php');

$pseudo=$_POST['pseudo'] ;

@$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

if($socket===false){
  die(socket_strerror(socket_last_error()));
}

@$connect=socket_connect($socket, $address, $port);

if($connect===false){
  die(socket_strerror(socket_last_error()));
}
else
        {
        $message = $pseudo." /connect";
        @$write=socket_write($socket, $message , strlen($message));
        if($write===false){
          die(socket_strerror(socket_last_error()));
        }
        while(true)
                {
                if($input = @socket_read($socket, $port))
                        {
                        $pseudo = stripslashes(substr($input , 0 , strpos($input , ' ')));
                        $message = stripslashes(substr($input , strpos($input , ' ')+1 , strlen($input)));
                        echo '['.$pseudo.']: '.$message.'<br />';
                        flush();
                        }
                else
                        {
                        echo "Le serveur a été éteint";
                        break;
                        }
                }
        socket_close($socket);
        }
?>
Voilà les trois script qui utilisent les socket...
serveur.php est lancé à côté tourne en continue,
send.php est appelé au coup par coup,
et reception.php est appelé via ajax en tant que listener...

Et voici le fichier de config:
<?php

$address='127.0.0.1';
$port=3535;

?>
Je répondrais aux question plus tard si le code ne suffit pas... ;)
Merci d'avance!

Re: Socket, accès multiple refusé...

Posté : 10 sept. 2009, 18:26
par FuZZyLine
Re,

Je ne sais si ca peut t'aider, peut-être l'as-tu déja, mais bah, au cas ou :

http://stephaneey.developpez.com/tutoriel/php/sockets/

Si j'ai une idée je reviens, la je dois dire que mon esprit est un brin en berne ;(

@+ bon code ;)