【问题标题】:Php Socket programming host errorphp Socket编程主机错误
【发布时间】:2014-05-12 07:45:55
【问题描述】:

我是新的套接字。我从谷歌的代码中得到了参考,但它似乎不起作用。
我正在发布服务器和客户端 php 文件。请确定问题。

服务器.php

<?php
$host = "xxx.xxx.xxx.xxx/myfolder/server.php"; //host
$port = 9000; //port

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) ;
$result = socket_bind($socket, $host, $port);
$result = socket_listen($socket,5);

$spawn = socket_accept($socket);

$input = socket_read($spawn , 1024);

$output = strrev($input)."n";

socket_write($spawn, $output , strlen($output));

socket_close($spawn);
socket_close($socket);
?>

这是 Client.php

<?
 $host    = "xxx.xxx.xxx.xxx/myfolder/server.php";
 $port    = 9000;

$socket = socket_create(AF_INET, SOCK_STREAM, 0) ;

$result = socket_connect($socket, $host, $port) ;

socket_write($socket, $message, strlen($message)) ;

$result = socket_read ($socket, 1024) ;
echo "Reply From Server  :".$result;

socket_close($socket);
?>

在我的主机上的公共目录中拥有上述两个文件之后。

我首先运行命令:php -q /var/www/html/myfolder/server.php
但我在我的 cmd shell 上得到了这个:

$ php -q /var/www/html/myfolder/server.php
PHP 警告:socket_bind():主机查找失败 [-10001]:第 13 行 /var/www/html/myfolder/server.php 中的未知主机
无法在服务器上绑定套接字

(是的,9000 端口是开放的)

【问题讨论】:

  • 你想完成什么?您确定要使用 PHP 作为服务器在套接字上侦听传入连接吗?虽然 PHP 可以做到这一点,但它并不是最适合的环境。例如,当您想要接受连接时,您需要保持服务器进程(PHP 脚本)一直运行。这可以通过运行一个 cronjob 来完成,每隔几次检查前一个进程是否仍然存在,等等。
  • 我只需要使用 php 来解决这个问题...你能建议我解决我的问题吗
  • 您看一下 Latheesan Kanes 提供的答案了吗?归根结底,主机是一个 IP 地址或解析为 IP 地址的主机名。但它不是 URL。套接字连接不一定使用 HTTP。

标签: php sockets web


【解决方案1】:

在创建套接字服务器时,不要将主机指定为脚本的完整 URL;这就是绑定失败的原因。

看看这个示例:http://www.php.net/manual/en/sockets.examples.php

#!/usr/local/bin/php -q
<?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 = '192.168.1.53';
$port = 10000;

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 -q /var/www/html/myfolder/server.php PHP 警告:socket_bind():无法绑定地址 [99]:无法在 /var/www/html 中分配请求的地址/myfolder/server.php 第 13 行无法在服务器上绑定套接字
  • 这就是我按照你的建议去做后得到的结果
  • 尝试将 ip 更改为 $address = '0.0.0.0'; - 我刚刚测试过它并且它有效。
  • okk..所以服务器已启动并正在运行,但现在客户端无法正常工作:无法将客户端连接到服务器我将主机保持为“xxx.xxx.xxx.xxx/myfolder/server. php"
  • 你看我贴的链接了吗?它具有服务器和客户端的代码。尝试使用此客户端代码:php.net/manual/en/sockets.examples.php#example-4676
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-13
  • 2012-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多