【问题标题】:Socket not working PHP套接字不工作PHP
【发布时间】:2010-10-16 06:27:43
【问题描述】:

这是我的代码

<?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 = 'localhost';
$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;
    }
do {
    $out = socket_read($msgsock, 2048);

    if (!empty($out)) {
        if ($out == 'quit') {
            break;
        }
        elseif ($out == 'shutdown') {
            socket_write($msgsock, 'plc down', 8);
            socket_close($msgsock);
            break 2;
        }
        else {
            switch ($out) {
                case "KABBE": $response = "Kabbe te!"; break;
                case "SZOPJ": $response = "Szopjal te!"; break;
                default: $response = "Ismeretlen parancs";
            }
            socket_write($msgsock, $response, strlen($response));
            break;
        }
    }
    } while (true);
socket_close($msgsock);
} while (true);

socket_close($sock);
?>

现在是错误

警告:socket_bind() [function.socket-bind]:无法绑定地址 [0]:每个套接字地址(协议/网络地址/端口)通常只允许使用一次。在第 18 行的 C:\wamp\www\socket\socket.php 中 socket_bind() 失败:原因:每个套接字地址(协议/网络地址/端口)通常只允许使用一次。 警告:socket_listen() [function.socket-listen]:无法侦听套接字 [0]:提供了无效参数。在第 22 行的 C:\wamp\www\socket\socket.php socket_listen() 失败:原因:提供了无效的参数。 警告:socket_accept() [function.socket-accept]:无法接受传入连接 [0]:提供了无效参数。在第 27 行的 C:\wamp\www\socket\socket.php 中 socket_accept() 失败:原因:提供的参数无效。

我在谷歌上搜索过,但没有任何用处。 有什么问题?

【问题讨论】:

    标签: php sockets


    【解决方案1】:

    在绑定之前使用此代码:

    if (!socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1)) {
        echo socket_strerror(socket_last_error($socket));
        exit;
    }
    

    供参考http://www.php.net/manual/en/function.socket-bind.php

    您也可以查看http://www.php.net/manual/en/function.socket-set-option.php了解详情

    【讨论】:

      【解决方案2】:

      PHP 还提供 stream_socket_server 和其他 stream_socket_* 函数。
      我发现这些对开发人员更友好。

      来自 php.net 的示例代码:

      $socket = stream_socket_server("tcp://localhost:8000", $errno, $errstr);
      if (!$socket) {
        echo "$errstr ($errno)<br />\n";
      } else {
        while ($conn = stream_socket_accept($socket)) {
          fwrite($conn, 'The local time is ' . date('n/j/Y g:i a') . "\n");
          fclose($conn);
        }
        fclose($socket);
      }
      

      【讨论】:

        【解决方案3】:

        'localhost' 不是有效地址,因为 socket_bind 不接受 DNS 名称,请使用等效的 IP 地址 '127.0.0.1'。

        More info

        【讨论】:

          【解决方案4】:

          这意味着您的计算机上的该端口上已经有一个打开的套接字。

          尝试切换到另一个未使用的端口。

          在 Windows 上(这似乎是您正在处理的),您可以从命令行查看打开的套接字列表:

          netstat -an
          

          如果您想知道哪些进程正在侦听这些端口,请尝试以下操作:

          netstat -ban
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-01-26
            • 2015-12-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-07-15
            相关资源
            最近更新 更多