2010-07-31 5 views
2

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

Это при доступе к некоторому приложению? Какое приложение? – Mchl

+0

это php-файл. Я буду использовать его в сервере/клиентском приложении с php. – ali

+0

Пожалуйста, покажите код. –

ответ

1

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

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

+0

Нет, это не работает на веб-странице. – ali

+2

Возможно, вы захотите изменить вопрос. Потому что это звучит так: это страница («на моей странице php-сервера», «с использованием сервера Wamp» и т. Д.). – cHao

0

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

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

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

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