1

I have copied Client/Server Socket Program from the following source

http://www.php.net/manual/en/sockets.examples.php

but when i run it in my browser it gives following error message:

socket_bind() reason: Only one usage of each socket address (protocol/network address/port) is normally permitted.

I have searched and tried different solutions but was unable to found the solution. Please help My code is below.

Server.php

<?php
error_reporting(E_ALL);

/* Permitir al script esperar para conexiones. */
//set_time_limit(0);

/* Activar el volcado de salida implícito, así veremos lo que estamo obteniendo
* mientras llega. */
ob_implicit_flush();

$address = '127.0.0.1';
$port = 9500;

if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {
    echo "socket_create() falló: razón: " . socket_strerror(socket_last_error()) . "\n";
}

if (socket_bind($sock, $address, $port) === false) {
    echo "socket_bind() falló: razón: " . socket_strerror(socket_last_error($sock)) . "\n";
}

if (socket_listen($sock, 5) === false) {
    echo "socket_listen() falló: razón: " . socket_strerror(socket_last_error($sock)) . "\n";
}

//clients array
$clients = array();

do {
    $read = array();
    $read[] = $sock;

    $read = array_merge($read,$clients);

    // Set up a blocking call to socket_select
    if(socket_select($read,$write = NULL, $except = NULL, $tv_sec = 5) < 1)
    {
        //    SocketServer::debug("Problem blocking socket_select?");
        continue;
    }

    // Handle new Connections
    if (in_array($sock, $read)) {        

        if (($msgsock = socket_accept($sock)) === false) {
            echo "socket_accept() falló: razón: " . socket_strerror(socket_last_error($sock)) . "\n";
            break;
        }
        $clients[] = $msgsock;
        $key = array_keys($clients, $msgsock);
        /* Enviar instrucciones. */
        $msg = "\nBienvenido al Servidor De Prueba de PHP. \n" .
        "Usted es el cliente numero: {$key[0]}\n" .
        "Para salir, escriba 'quit'. Para cerrar el servidor escriba 'shutdown'.\n";
        socket_write($msgsock, $msg, strlen($msg));

    }

    // Handle Input
    foreach ($clients as $key => $client) { // for each client        
        if (in_array($client, $read)) {
            if (false === ($buf = socket_read($client, 2048, PHP_NORMAL_READ))) {
                echo "socket_read() falló: razón: " . socket_strerror(socket_last_error($client)) . "\n";
                break 2;
            }
            if (!$buf = trim($buf)) {
                continue;
            }
            if ($buf == 'quit') {
                unset($clients[$key]);
                socket_close($client);
                break;
            }
            if ($buf == 'shutdown') {
                socket_close($client);
                break 2;
            }
            $talkback = "Cliente {$key}: Usted dijo '$buf'.\n";
            socket_write($client, $talkback, strlen($talkback));
            echo "$buf\n";
        }

    }        
} while (true);

socket_close($sock);
?>

Client.php

<?php
//error_reporting(E_ALL);

echo "<h2>TCP/IP Connection</h2>\n";

/* Get the port for the WWW service. */
//$service_port = getservbyname('www', 'tcp');
$service_port=9500;

/* Get the IP address for the target host. */

$address='127.0.0.1';

/* Create a TCP/IP socket. */
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
} else {
    echo "OK.\n";
}

echo "Attempting to connect to '$address' on port '$service_port'...";
$result = socket_connect($socket, $address, $service_port);
if ($result === false) {
    echo "socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "\n";
} else {
    echo "OK.\n";
}

$in = "HEAD / HTTP/1.1\r\n";
$in .= "Host: www.example.com\r\n";
$in .= "Connection: Close\r\n\r\n";
$out = '';

echo "Sending HTTP HEAD request...";
socket_write($socket, $in, strlen($in));
echo "OK.\n";

echo "Reading response:\n\n";
while ($out = socket_read($socket, 2048)) {
    echo $out;
}

echo "Closing socket...";
socket_close($socket);
echo "OK.\n\n";
?>
user3812616
  • 11
  • 1
  • 7
  • are you having this issue on a windows or linux machine? it could be that there is a process that is still running that is holding open the socket you're trying to connect to – Jeff Lambert Jul 10 '14 at 17:46
  • I am running it on windows system and i have changed the port also after checking it using netstat command. Please check my code if there is any mistake, because i am new to socket programming. – user3812616 Jul 10 '14 at 17:48
  • Have you seen this: http://social.msdn.microsoft.com/Forums/vstudio/en-US/666798d3-fc9a-4906-b1b8-0b26d8edf1a4/tcp-error-10048-only-one-usage-of-each-socket-address-protocolnetwork-addressport-is-normally?forum=wcf – Barmar Jul 10 '14 at 17:50
  • @alk: can you please point out the mistake in my code because your link does not solve my problem. – user3812616 Jul 10 '14 at 18:02
  • Related: http://blogs.msdn.com/b/dgorti/archive/2005/09/18/470766.aspx – alk Jul 10 '14 at 18:18
  • @alk:After adding socket_set_option($sock, SOL_SOCKET, SO_REUSEADDR, 1); before bind the server is started but it neither gives any output and neither stops. – user3812616 Jul 10 '14 at 18:20
  • Didn't you just say, it did not solve your problem? :-/ – alk Jul 10 '14 at 18:21
  • But the server program is continuously running and didn't showing any output to the browser. – user3812616 Jul 10 '14 at 18:25

1 Answers1

0

In addition to the link @Barmar posted in the comments, I found this article and this one, each of which are pointing to the possibility that you're either running out of ports or using an invalid port number.

I don't have too much experience with Windows in this regards, but that second article at least is claiming that you can either use a port in the range 1024-5000, or change a registry setting if you want to go higher. I would try setting your port to something in that range, say 4950, and see if that clears your issue up.

The registry key in question for any of those interested is HKLM\System\CurrentControlSet\Services\Tcpip\Parameters\MaxUserPort and the value can go up to 65534. However, I doubt this would be a necessary step, unless you already have ~4000 other processes already running that are using up all of your available ports.

Jeff Lambert
  • 24,395
  • 4
  • 69
  • 96