代码之家  ›  专栏  ›  技术社区  ›  Artshellorok

Php套接字无法正常工作(CentOS 7)

  •  1
  • Artshellorok  · 技术社区  · 8 年前
    <?php
    function go(){
        $starttime = round(microtime(true),2);
        echo "GO() ... <br />\r\n";
    
        echo "socket_create ...";
        $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    
        if($socket < 0){
            echo "Error: ".socket_strerror(socket_last_error())."<br />\r\n";
            exit();
        } else {
            echo "OK <br />\r\n";
        }
    
    
        echo "socket_bind ...";
        $bind = socket_bind($socket, '127.0.0.1', 889);//привязываем его к указанным ip и порту
        if($bind < 0){
            echo "Error: ".socket_strerror(socket_last_error())."<br />\r\n";
            exit();
        }else{
            echo "OK <br />\r\n";
        }
    
        socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);//разрешаем использовать один порт для нескольких соединений
    
        echo "Listening socket... ";
        $listen = socket_listen($socket, 5);//слушаем сокет
    
        if($listen < 0){
            echo "Error: ".socket_strerror(socket_last_error())."<br />\r\n";
            exit();
        }else{
            echo "OK <br />\r\n";
        }
    
        while(true){ //Бесконечный цикл ожидания подключений
            echo "Waiting... ";
            $accept = @socket_accept($socket); //Зависаем пока не получим ответа
            if($accept === false){
                echo "Error: ".socket_strerror(socket_last_error())."<br />\r\n";
                usleep(100);
            } else {
                echo "OK <br />\r\n";
                echo "Client \"".$accept."\" has connected<br />\r\n";
                file_put_contents("res.txt", "OK ");
            }
    
            $msg = "Hello, Client!";
            echo "Send to client \"".$msg."\"... ";
            socket_write($accept, $msg);
            echo "OK <br />\r\n";
    
            if( ( round(microtime(true),2) - $starttime) > 100) {
                echo "time = ".(round(microtime(true),2) - $starttime);
                echo "return <br />\r\n";
                return $socket;
            }
    
    
        }
    
    
    }
    
    error_reporting(E_ALL); //Выводим все ошибки и предупреждения
    set_time_limit(0);      //Время выполнения скрипта не ограничено
    ob_implicit_flush();    //Включаем вывод без буферизации
    
    $socket = go();         //Функция с бесконечным циклом, возвращает $socket по запросу выполненному по прошествии 100 секнуд.
    
    echo "go() ended<br />\r\n";
    
    if (isset($socket)){
        echo "Closing connection... ";
        @socket_shutdown($socket);
        socket_close($socket);
        echo "OK <br />\r\n";
    }
    ?>
    

    当打开带有此代码的页面时,它将开始无限加载

    端口889/tcp已打开

    这台机器有来自remi存储库的php 7.2,其中包含以下插件:php php mysql php gd php ldap php odbc php pear php xml php xmlrpc php mbstring php snmp php soap curl curl devel php mcrypt php pecl ap

    出现这种问题的原因是什么?当连接时,什么都不会发生。

    1 回复  |  直到 8 年前
        1
  •  0
  •   Artshellorok    8 年前

    问题是浏览器不能运行套接字(实际上可以这样做,但看不到程序返回的内容),php套接字必须通过控制台运行(例如:php filename.php)。socket\u bind函数中应使用WAN ip(全局ip)。

    推荐文章