невозможно связать адрес [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"; ?>
Эмм … это работает на веб-странице? Если это так, каждое попадание на страницу приведет к тому, что скрипт попытается привязать к порту 1234, который не будет происходить ни для одного, ни для одного за раз. Все остальные умрут.
Если это не так, то есть две причины, по которым я могу сразу подумать, почему привязка не удалась: либо другая программа уже использует порт, либо брандмауэр блокирует его. Последнее не должно иметь место для 127.0.0.1, но я видел, как происходят странные вещи.
Приведенный код должен работать, по крайней мере, здесь. Вы уверены, что нет брандмауэра, препятствующего открытию сокета?
Это не имеет большого значения, но при открытии сокета укажите правильный протокол:
$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);
перед привязкой, чтобы сообщить системе, что он должен разрешить повторное использование порта.