Php socket_close()挂起我的客户端,直到服务器断开我的连接

Php socket_close()挂起我的客户端,直到服务器断开我的连接,php,vb.net,sockets,client,Php,Vb.net,Sockets,Client,这是我的php客户端代码: <?php $service_port = 5310; $address = gethostbyname('192.168.40.100'); $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if ($socket === false) echo "socket_create() falló: razón: " . socket_strerror(s

这是我的php客户端代码:

<?php
    $service_port = 5310;
    $address = gethostbyname('192.168.40.100');

    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    if ($socket === false)
        echo "socket_create() falló: razón: " . socket_strerror(socket_last_error()) . "<br />";
    else
    {
        $result = socket_connect($socket, $address, $service_port);
        if ($result === false)
            echo "socket_connect() falló.\nRazón: ($result) " . socket_strerror(socket_last_error($socket)) . "<br />";
        else
        {   
            $in = "Envio esto: HOLA";
            $out = 'RESPONSE: ';
            echo "ANTES: " . date("H:i:s") . "<br />"; // #1
            socket_write($socket, $in, strlen($in));
            echo "DESPUÉS: " . date("H:i:s") . "<br />"; // #2 Same time as #1
            // Leer/imprimir respuesta
            while ($out = socket_read($socket, 2048))
                echo "RESPONSE: " . date("H:i:s") . " " . $out; // #3 Same time as #2
        }
    }

    // Cerramos socket
    socket_close($socket);
    echo "BANANA: " . date("H:i:s") . "<br />"; // Always run when I got disconected from server
?>

可能是您处于阻塞模式

试一试

连接后


这样,如果没有要读取的数据,您就不会挂起套接字并关闭,而不用等待服务器执行操作。

您好,谢谢您的回答,但我需要收到服务器的响应,因此我想我必须使用阻塞模式。我将更新我的代码。一种解决方案是设置非阻塞,然后循环读取调用,因此如果从未从服务器收到任何数据,请重试读取。(然后设置一个自定义超时,或者在您停止尝试读取时进行另一次检查)。这是一个很好的解决方案,当到达de
socket\u close()
时,购买为什么我的php没有
nonblock
挂起?您确定它挂起在socket\u close吗?你可以在socket_关闭之前尝试socket_shutdown($socket),socket_关闭会关闭套接字的发送和接收。现在一切正常,谢谢,我做得不好,现在我的代码已经修复,谢谢你。
<?php
    $service_port = 5310;
    $address = gethostbyname('192.168.40.100');

    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    if ($socket === false)
        echo "socket_create() falló: razón: " . socket_strerror(socket_last_error()) . "<br />";
    else
    {
        $result = socket_connect($socket, $address, $service_port);
        if ($result === false)
            echo "socket_connect() falló.\nRazón: (" . $result . ") " . socket_strerror(socket_last_error($socket)) . "<br />";
        else
        {   
            $in = "Envio esto: HOLA";
            $out = '';
            $response = "RESPONSE: ";
            echo "PRIMERA;";
            socket_write($socket, $in, strlen($in));
            while ($out = socket_read($socket, 2048))
                $response .= $out;
            echo $response . ";SEGUNDA;";
            $in = "close";
            $out = '';
            $response = "";
            socket_write($socket, $in, strlen($in));
            while ($out = socket_read($socket, 2048))
                $response .= $out;
            echo $response . " " . date("H:i:s");
        }
    }
    socket_close($socket);
?>
socket_set_nonblock($socket);