【问题标题】:Can't Create Client Server Socket Program in Php无法在 PHP 中创建客户端服务器套接字程序
【发布时间】:2014-08-31 21:31:18
【问题描述】:

我正在为类似聊天的应用程序开发客户端服务器套接字程序,但它给出了以下错误消息

警告:socket_bind():无法绑定地址 [98]:地址已在使用中......无法绑定到第 15 行的地址

我看过各种教程,但我希望服务器持续监听客户端请求。我已经看到它也打开了端口号,但仍然是相同的消息。我被困在这一点上好几天无法得到正确的解决方案。请帮忙解决谢谢.....

服务器.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);
    ?>

客户端.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";
?>

【问题讨论】:

  • 客户端和服务器是否在同一台机器上创建相同的端口?那是行不通的。
  • @Seb 但在其他各种示例中,我看到客户端和服务器在同一台机器上使用相同的端口。你能指出我的代码中的错误吗?
  • 正如 Baalthasarr 在他的回答中指出的那样。服务器创建端口,客户端使用它。我将编辑我的评论以使其更好。
  • @Seb 由于我是 Socket 编程的新手,你能给我一个任何教程的链接,服务器在不关闭或编辑我上面的代码的情况下继续监听客户端请求,以便我理解。谢谢...
  • @Seb:我已经从 PHP 手册中复制了代码,但是服务器没有正确显示输出,运行一段时间后它显示以下错误警告:socket_bind():无法绑定地址 [98] : 地址已经在 18 年使用,我已经编辑了我的代码。

标签: php sockets


【解决方案1】:

在两个 php 文件中,您在同一端口上创建一个 Socket。这就是问题所在。

服务器必须创建套接字,而客户端必须使用套接字(也不创建它)

两个应用程序不能创建同一个套接字并监听同一个端口。

编辑: 我已经在本地主机上使用 xampp 测试了您的脚本。所以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';

【讨论】:

  • 谢谢.. 但是在各种教程中,我看到客户端和服务器使用相同的端口进行连接,所以我必须为客户端使用一个端口,为服务器使用另一个端口。或者你可以给我任何其他的客户端服务器教程,服务器在不关闭的情况下继续监听客户端请求。
  • 在服务器上监听端口,在客户端连接到端口。在这两种情况下,端口是相同的,但工作方式不同。
  • @Marek:我已经从 PHP 手册中复制了代码,但服务器没有显示任何输出,它继续运行,运行一段时间后显示以下错误警告:socket_bind():无法绑定地址 [98]:地址已在 18 中使用,我已经编辑了我的代码。
  • @user3812616 现在我看到您正在尝试绑定到端口 80。您没有运行另一个网络服务器(例如 apache)吗?
  • @Marek:我在主服务器 Centos OS 上运行它 15213 是我必须使用的端口。所以我必须在我的代码中进行更改。
猜你喜欢
  • 2014-03-10
  • 1970-01-01
  • 1970-01-01
  • 2014-11-05
  • 2019-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-11
相关资源
最近更新 更多