views:

43

answers:

2

unable to bind address [0]: Only one usage of each socket address (protocol/network address/port) is normally permitted.... error is given by my php server page. I tried different port numbers as looking from cmd as writing netstat -an. Also I searched on google but no solution. I am using wamp server and working local . Thanks .

<?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";
?>
A: 

Erm...this is running on a web page? If so, each hit to the page will cause the script to try to bind to port 1234, which ain't gonna happen for any but one at a time. All the others will die.

If it's not, then there are two reasons i can think of right off why binding would fail: either another program is already using the port, or the firewall is blocking it. The latter shouldn't be the case for 127.0.0.1, but i've seen stranger things happen.

cHao
No this is not runnig on a web page.
ali
You may want to edit the question, then. Cause it sounds like this is a page ("by my php server page", "using wamp server", etc).
cHao
A: 

The code as posted should work, at least it does here. Are you sure there is no firewalling thing preventing you from opening the socket?

It shouldn't matter much, but when opening the socket, specify the right protocol:

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

If that doesn't help, try a loop to find a listening port that may work; maybe the port is still blocked by your previous attempts.

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");

If this solves your problem, you may want to do

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

before binding, to tell the system that it should allow reuse of the port.

mvds