begin process at 2012 05 28 22:43:11
  Trouver un code source :
 
dans
 
Accueil > Forum > 

PHP

 > 

Divers

 > 

Général

 > 

Erreur avec socket_bind php


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Erreur avec socket_bind php

mercredi 1 septembre 2010 à 08:33:32 | Erreur avec socket_bind php

BencoAndCo

Bonjour !


J'ai un problème avec socket_bind() :

dans un code de mini-chat je dois lancer un script dans lequel il y a un socket_bind le problème est que ça plante et affiche ce message pour la fonction socket bind :


Warning: socket_bind() [function.socket-bind]: unable to bind address [0]: Une seule utilisation de chaque adresse de socket (protocole/adresse réseau/port) est habituellement autorisée. in C:\Program Files\EasyPHP 3.0\www\serveur.php on line 27
Port déja utilise


savez vous en général ce qui peut empêcher socket_bind() de fonctionner ? Quelles sont les erreurs typiques avec cette fonction ?


mon script se présente comme ceci (c'est le script créé par azmeuk sur le SDZ dans le tuto sur les sockets en php) :


<?php
set_time_limit(0);

//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,SOL_TCP);
if($this->socket)
{

echo "creation de socket reussie !\n";

}

// socket_close($this->socket);
//on lie la ressource sur laquelle le serveur va écouter
socket_bind($this->socket, $adresse,$port) or die("Port déja utilise\n");
echo socket_last_error()."<br></br>";
echo socket_strerror(socket_last_error());

//socket_connect($this->socket, $adresse, $port) or die("Bug !\n");
//On prépare l'écoute
socket_listen($this->socket);
//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);
//Cette méthode lit les données reçues par un client, et les redistribue
$reception = socket_read($this->client , 255);
$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";
}
//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();
}
}
}
}
$chat = new Chat_Server();
$chat->Start('192.168.x.x',35353);
?>



ma config :

J'utilise easyphp comme serveur en local que j'ai rendu accessible dans tout le reseau local via l'adresse ip du serveur.


Merci pour vos rep. !




@+!

;-)
mercredi 1 septembre 2010 à 08:45:23 | Re : Erreur avec socket_bind php

BencoAndCo


je precise que j'ai verifié le port que j'utilise et il n'est urilisé par aucun protocol
et n'est pas sensé être utilisé par easyphp, comment vérifier ce point ?

;-)
mercredi 1 septembre 2010 à 17:02:49 | Re : Erreur avec socket_bind php

BencoAndCo

Comme ça c'est peut être mieux
Code PHP :



<?php
set_time_limit(0);

//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,SOL_TCP);
if($this->socket)
{

echo "creation de socket reussie !\n";

}

// socket_close($this->socket);
//on lie la ressource sur laquelle le serveur va écouter
socket_bind($this->socket, $adresse,$port) or die("Port déja utilise\n");
echo socket_last_error()."<br></br>";
echo socket_strerror(socket_last_error());

//socket_connect($this->socket, $adresse, $port) or die("Bug !\n");
//On prépare l'écoute
socket_listen($this->socket);
//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);
//Cette méthode lit les données reçues par un client, et les redistribue
$reception = socket_read($this->client , 255);
$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";
}
//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();
}
}
}
}
$chat = new Chat_Server();
$chat->Start('192.168.x.x',35353);
?>



;-)
jeudi 2 septembre 2010 à 09:33:30 | Re : Erreur avec socket_bind php

TychoBrahe

Salut,

Autant être franc : c'est du code très brouillon bourré d'erreurs de conceptions. Voici ce que j'ai réussi à dégager du tas (il doit y avoir d'autres trucs à excaver) :
- Très mauvaise utilisation de la programmation orientée objet, si c'est pour continuer à faire une énorme méthode unique qui contient tout le code de ton programme autant ne pas utiliser d'objets.
- Gestion des erreurs tout aussi mauvaises. Je ne prendrai comme exemple que le socket_create() : si la fonction réussie tu affiche un message et en cas d'échec tu continue ton code comme un gros boulet.
- Mais bon sang c'est quoi ces socket_accept() et socket_read() à chaque tour de boucle ? Pourquoi il n'y a pas de socket_select() pour savoir sur quelle socket lire ou accepter une connexion ?
- Et la socket du serveur tu la ferme où ? Ton soucis viens semble-t-il de là, à quitter le programme sans fermer proprement la socket cette dernière ne doit pas disparaitre avant un certains temps, laissant le port utilisé.
jeudi 2 septembre 2010 à 11:14:00 | Re : Erreur avec socket_bind php

BencoAndCo


Peux tu être plus explicite ?
tu dis que le problème est la fermeture de la socket... alors que si tu regardes il y a bien à la fin "socket_close($this->client);"

C'est vrai que le code n'est pas terrible (c pas le mien ) j'ai trouvé un autre bout de code qui fait la même chose et qui a l'air de mieux fonctionner.



ce code était sensé réaliser un mini serveur de chat attendant des connect , read write sur ses sockets. Aurais tu un script qui fait la même chose pour expliciter l'utilisation de la fonction socket_bind ?

Merci



;-)
jeudi 2 septembre 2010 à 12:02:01 | Re : Erreur avec socket_bind php

TychoBrahe

Réponse acceptée !

tu dis que le problème est la fermeture de la socket... alors que si tu regardes il y a bien à la fin "socket_close($this->client);"


Ce socket_close() concerne uniquement la fermeture de la socket d'un client, pas celle du serveur ($this->socket);

Aurais tu un script qui fait la même chose pour expliciter l'utilisation de la fonction socket_bind ?


Pas sous la main non, mais tu trouveras sans doute ton bonheur .


Cette discussion est classée dans : message, socket, echo, reception, bind


Répondre à ce message

Sujets en rapport avec ce message

formulaire [ par poloute ] Bonjour"undelivered message"c'est ce qui accompagne chaque fois lemail que je reçoit dans ma boite via mon site.Voici le script:$MailTo = "monadresse@ Entrée se transforme par "/" [ par nd25 ] Bonjour à tous !J'utilise un livre d'or à cette adresse :http://www.3monde.net/livredor/mais comme vous pouvez le voir des / apparaissent un peu parto formulaire avec piece jointe probleme [ par ggsecours ] BonjourJe debute plus ou moins en php mais j'ai déjà un bon formulaire assez costau avec verification des champs pour envoie par mail mais le seul pro socket [ par LaTatadu91 ] salut,voila j'essaie de faire communiquer deux programmes un en PHP et l'autre en C et j'utilise pr cela les sockets de PHP avec le protocole TCP/IP.. problème avec formulaire d'envoi de newsletter très basic [ par Broack Dincht ] bonjour J'ai écri un formulaire d'envoi de newsletter très basique. Grace à un formulaire, on inscrit l'objet et le contenu du message. Les adresses d probleme de type lors d'un envoi par socket... [ par LaTatadu91 ] Salut a tous; voila mon soucis c'est que j'envoi un message a un serveur ecrit en C par l'intermediaire de socket.... jusque la pas de soucis,le pb c probleme de type lors d'un envoi par socket... [ par LaTatadu91 ] Salut a tous; voila mon soucis c'est que j'envoi un message a un serveur ecrit en C par l'intermediaire de socket.... jusque la pas de soucis,le pb c pseudo chat en php : problème d'actualisation de la page d'affichage des messages [ par Tristan75 ] Bonjour, Je créer un pseudo chat et j'ai quelque problème d'actualisation.Le principe de base est le suivant :chaque internaute s'enregistre dans une Boucle while et fonction mail [ par rems02 ] J'ai une base de donnée dans la quelle je recupère des données suivantes $piece $annee $observations les variables $piece et $annee p passage de paramètres en l'URL??????? [ par zsafae ] bonjour j'arrive pas a passer le paramètre l en url,es ce un problème de syntaxe?voici mon code:$message=" Mot de passe oublié?";   echo $message;<B


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,137 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales