2010-07-31 6 views
2

impossible de lier l'adresse [0]: Une seule utilisation de chaque adresse de socket (protocole/adresse réseau/port) est normalement autorisée .... erreur est donnée par mon php page du serveur. J'ai essayé différents numéros de port en regardant depuis cmd en écrivant netstat -an. J'ai aussi cherché sur google mais pas de solution. J'utilise le serveur de wamp et le travail local. Merci.impossible de lier l'adresse [0]: erreur php

<?php 
// don't timeout 
//echo phpinfo(); 
set_time_limit (0); 
// set some variables 
$host = "127.0.0.1"; 
$port = 1234; 
// create socket 
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n"); 
// bind socket to port 
$result = socket_bind($socket, $host, $port) or die("Could not bind to socket\n"); 
// start listening for connections 
$result = socket_listen($socket, 3) or die("Could not set up socket listener\n"); 
echo "Waiting for connections...\n"; 
// accept incoming connections 
// spawn another socket to handle communication 
$spawn = socket_accept($socket) or die("Could not accept incoming connection\n"); 
echo "Received connection request\n"; 
// write a welcome message to the client 
$welcome = "Roll up, roll up, to the greatest show on earth!\n? "; 
socket_write($spawn, $welcome, strlen ($welcome)) or die("Could not send connect string\n"); 
// keep looping and looking for client input 
do 
{ 
    // read client input 
    $input = socket_read($spawn, 1024, 1) or die("Could not read input\n"); 
    if (trim($input) != "") 
    { 
    echo "Received input: $input\n"; 
    // if client requests session end 
    if (trim($input) == "END") 
    { 
     // close the child socket 
     // break out of loop 
     socket_close($spawn); 
     break; 
    } 
    // otherwise... 
    else 
    { 
     // reverse client input and send back 
     $output = strrev($input) . "\n"; 
     socket_write($spawn, $output . "? ", strlen (($output)+2)) or die("Could not write output\n"); 
     echo "Sent output: " . trim($output) . "\n"; 
    } 
    } 
} while (true); 
// close primary socket 
socket_close($socket); 
echo "Socket terminated\n"; 
?> 
+0

Est-ce l'utilisation de certaines applications? Quelle application? – Mchl

+0

c'est un fichier php. Je vais l'utiliser dans l'application serveur/client avec php. – ali

+0

S'il vous plaît montrer du code. –

Répondre

1

Erm ... cela fonctionne sur une page Web? Si c'est le cas, chaque coup sur la page provoquera le script à essayer de se lier au port 1234, ce qui ne se produira que pour un seul à la fois. Tous les autres vont mourir.

Si ce n'est pas le cas, il y a deux raisons pour lesquelles je peux penser pourquoi la liaison échouerait: soit un autre programme utilise déjà le port, soit le pare-feu le bloque. Ce dernier ne devrait pas être le cas pour 127.0.0.1, mais j'ai vu des choses étranges arriver.

+0

Non, cela ne fonctionne pas sur une page Web. – ali

+2

Vous voudrez peut-être modifier la question, alors. Parce qu'il semble que ce soit une page ("par ma page de serveur php", "en utilisant le serveur wamp", etc). – cHao

0

Le code affiché devrait fonctionner, du moins c'est le cas ici. Êtes-vous sûr qu'il n'y a pas de pare-feu qui vous empêche d'ouvrir le socket?

Il ne devrait pas beaucoup d'importance, mais l'ouverture de la prise, spécifiez le protocole droit:

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

Si cela ne fonctionne pas, essayez une boucle pour trouver un port d'écoute qui peut fonctionner; peut-être que le port est toujours bloqué par vos tentatives précédentes.

for ($port = 1234; $port < 65536; $port++) 
{ 
    $result = socket_bind($socket, $host, $port) or die("Could not bind to socket\n"); 
    if ($result) 
    { 
     print "bind succeeded, port=$port\n"; 
     break; 
    } else { 
     print "Binding to port $port failed: "; 
     print socket_strerror(socket_last_error($socket))."\n"; 
    } 
} 
if ($port == 65536) die("Unable to bind socket to address\n"); 

Si cela résout votre problème, vous pouvez faire

socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1); 

avant de se lier, pour indiquer au système qu'il doit permettre la réutilisation du port.

Questions connexes