2010-07-31 76 views
2

無法綁定地址[0]:每個套接字地址(協議/網絡地址/端口)通常只允許使用一次.... 錯誤由我的php服務器頁面。我嘗試了不同的端口號,如從cmd看netstat -an。我也搜索谷歌,但沒有解決方案。我正在使用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 2010-07-31 11:45:15

+0

這是一個php文件。我將在服務器/客戶端應用程序中使用它。 – ali 2010-07-31 11:47:17

+0

請顯示一些代碼。 – 2010-07-31 12:00:33

回答

1

呃...這是在網頁上運行嗎?如果是這樣,每次打到頁面將導致腳本嘗試綁定到端口1234,這是不會發生的,除了一次一個。所有其他人將死亡。

如果不是這樣,那我有兩個理由可以解釋爲什麼綁定會失敗:另一個程序已經在使用端口,或者防火牆阻止了它。後者不應該是127.0.0.1的情況,但我已經看到了陌生的事情發生。

+0

不,這是不是在網頁上runnig。 – ali 2010-07-31 12:19:17

+2

然後,您可能需要編輯問題。因爲它聽起來像是一個頁面(「通過我的php服務器頁面」,「使用wamp服務器」等)。 – cHao 2010-07-31 12:27:24

0

發佈的代碼應該可以工作,至少它在這裏。你確定沒有阻止你打開socket的防火牆嗎?

它不應該沒有多大關係,但打開插座時,指定合適的協議:

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

結合之前,告訴系統,它應該允許端口的重用。

相關問題