无法绑定地址[0]:php错误

时间:2010-07-31 11:43:01

标签: php sockets client wampserver

无法绑定地址[0]:通常只允许使用每个套接字地址(协议/网络地址/端口).... 错误由我的php服务器页面给出。我尝试了不同的端口号,从cmd看写为netstat -an。我也搜索谷歌但没有解决方案。我正在使用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 个答案:

答案 0 :(得分:1)

嗯...这是在网页上运行的?如果是这样,每次点击页面都会导致脚本尝试绑定到端口1234,这对于除了一次之外的任何一个都不会发生。所有其他人都会死。

如果不是,那么我有两个理由可以想到为什么绑定会失败:另一个程序已经在使用该端口,或者防火墙正在阻止它。后者不应该是127.0.0.1的情况,但我发现有些奇怪的事情发生了。

答案 1 :(得分: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);

绑定之前,告诉系统它应该允许重用端口。