невозможно привязать адрес [0]: ошибка php - PullRequest
2 голосов
/ 31 июля 2010

невозможно связать адрес [0]: обычно разрешено только одно использование каждого адреса сокета (протокол / сетевой адрес / порт) .... ошибка дается моей страницей php сервера. Я пробовал разные номера портов, как при взгляде из cmd, при написании netstat -an. Также я искал в Google, но нет решения. Я использую сервер wamp и работаю локально. Спасибо.

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

Ответы [ 2 ]

1 голос
/ 31 июля 2010

Хм ... это работает на веб-странице?Если это так, то при каждом попадании на страницу скрипт будет пытаться привязаться к порту 1234, чего не случится ни с кем, кроме одного за раз.Все остальные умрут.

Если это не так, то сразу можно подумать о двух причинах сбоя привязки: либо другая программа уже использует порт, либо брандмауэр блокирует его.Последнее не должно относиться к 127.0.0.1, но я видел странные вещи.

0 голосов
/ 31 июля 2010

Код, как опубликовано, должен работать, по крайней мере, здесь. Вы уверены, что нет брандмауэра, препятствующего открытию сокета?

Это не должно иметь большого значения, но при открытии сокета укажите правильный протокол:

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

Если это не поможет, попробуйте выполнить цикл, чтобы найти порт прослушивания, который может работать; возможно, порт все еще заблокирован вашими предыдущими попытками.

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

Если это решит вашу проблему, вы можете сделать

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

перед привязкой, чтобы сообщить системе, что она должна разрешить повторное использование порта.

...