2014-07-10 15 views
0

我在客戶端服務器套接字程序工作就像應用程序創建的聊天客戶端服務器的Socket程序,但它給下面的錯誤消息不能在Php

警告:socket_bind():無法綁定地址[ 98]:地址已在使用....無法綁定到第15行上的地址

我已經看到各種教程,但我希望服務器不斷收聽客戶端請求。我看到它的端口號也是開放的,但仍然是相同的信息。我在這一點卡住了幾天無法得到適當的解決方案。請幫助解決這個問題.....感謝

Server.php:

<?php 
    error_reporting(E_ALL); 

    /* Allow the script to hang around waiting for connections. */ 
    set_time_limit(0); 

    /* Turn on implicit output flushing so we see what we're getting 
    * as it comes in. */ 
    ob_implicit_flush(); 

    $address = 'XXX.XX.XX.XXX'; 
    $port = 15213; 

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

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

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

    do { 
     if (($msgsock = socket_accept($sock)) === false) { 
      echo "socket_accept() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n"; 
      break; 
     } 
     /* Send instructions. */ 
     $msg = "\nWelcome to the PHP Test Server. \n" . 
      "To quit, type 'quit'. To shut down the server type 'shutdown'.\n"; 
     socket_write($msgsock, $msg, strlen($msg)); 

     do { 
      if (false === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) { 
       echo "socket_read() failed: reason: " . socket_strerror(socket_last_error($msgsock)) . "\n"; 
       break 2; 
      } 
      if (!$buf = trim($buf)) { 
       continue; 
      } 
      if ($buf == 'quit') { 
       break; 
      } 
      if ($buf == 'shutdown') { 
       socket_close($msgsock); 
       break 2; 
      } 
      $talkback = "PHP: You said '$buf'.\n"; 
      socket_write($msgsock, $talkback, strlen($talkback)); 
      echo "$buf\n"; 
     } while (true); 
     socket_close($msgsock); 
    } 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'); 

/* Get the IP address for the target host. */ 
$address = gethostbyname('www.example.com'); 

/* 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"; 
?> 
+0

客戶端和服務器是否在同一臺機器上創建相同的端口?這是行不通的。 – Seb

+0

@Seb但是在其他各種示例中,我已經看到客戶端和服務器在同一臺機器上使用相同的端口。可以在代碼中指出錯誤。 – user3812616

+0

正如Baalthasarr在他的回答中指出的那樣。服務器創建端口,客戶端使用它。我要編輯我的評論,使其更好。 – Seb

回答

1

在這兩個PHP文件創建同一端口的插座上。那就是問題所在。

服務器已經創建了Socket而客戶端必須使用Socket(沒有創造它,太)

兩個應用程序不能創建相同的插座和收聽同一端口上。

編輯: 我已經用xampp在localhost上測試了你的腳本。所以IP是127.0.0.1。服務器在端口15213上正確監聽,客戶端在此端口上正確連接。 該端口是打開的,我看到了xampp控制面板。

如果您使用腳本像你張貼在這裏,那麼你必須在Server.php

$address = 'XXX.XX.XX.XXX'; 

$address = '127.0.0.1'; 

和Client.php

$address = gethostbyname('www.example.com'); 

更換與

$address = gethostbyname('localhost'); 
or 
$address = '127.0.0.1'; 
+0

謝謝..但在各種教程中,我看到客戶端和服務器使用相同的端口進行連接,所以我必須使用一個端口的客戶端和其他端口的服務器。或者你可以給我任何其他的客戶端服務器教程,其中服務器不停地監聽客戶端請求。 – user3812616

+0

在服務器上,您在端口上偵聽,在您連接到端口的客戶端中。在這兩種情況下,港口都是一樣的,但工作方式不同。 – Marek

+0

@Marek:我已經從PHP手冊複製了代碼,但服務器不顯示任何輸出並且它一直運行,並且在運行一段時間後顯示以下錯誤警告:socket_bind():無法綁定地址[98]:地址已經存在在18年的使用中,我編輯了我的代碼。 – user3812616