【问题标题】:socket_read() not blockingsocket_read() 没有阻塞
【发布时间】:2016-02-29 19:25:20
【问题描述】:

试图让我的 socket_read() 在之前已经读取数据时阻塞。 我需要它在再次发送之前等待 $spawn 套接字有新数据(可以相等,即希望它在收到“FE”时读取两次)。

当没有任何新数据时如何阻止它?

$i=0;
while ($i<10){
    //Read and Parse Client input
    $input = strtoupper(bin2hex(socket_read($spawn, 1)));
    echo $input . "\n";

    //Deal with requests
    if ($input == "FE"){ //Server Ping
        socket_write($spawn, $ping_packet);
        echo "Ping Attempt \n";
    } elseif ($input == "02"){ //Handshake Request
        socket_write($spawn, $handshake_packet);
        echo "Handshake Attempt \n";
    } elseif($input == "01"){ //Login Request
        socket_write($spawn, $kick_packet);
        echo "Login Attempt \n";
    }
        $i++;
}

【问题讨论】:

    标签: php sockets


    【解决方案1】:

    您可以使用socket_set_block 将套接字设置为阻塞。如何同时处理大量套接字,请参阅socket_select

    【讨论】:

    • socket_set_block 导致我的脚本跳过 socket_read(),或者将其设置为根本不阻塞。
    • 我意识到学习 Node.js 并用它编写它比弄清楚这一点更容易。谢谢大家的帮助。
    • @fiskfisk 你能检查一下this Q吗?它是关于套接字和 +100 赏金的!谢谢
    【解决方案2】:

    如果没有数据可供读取,socket_read 将返回一个空字符串。要进行阻塞读取,请使用带有标志 MSG_WAITALL 的 socket_recv。

    【讨论】:

      猜你喜欢
      • 2013-05-14
      • 1970-01-01
      • 1970-01-01
      • 2015-03-12
      • 2019-07-06
      • 2013-08-19
      • 1970-01-01
      • 2017-07-30
      • 2013-08-10
      相关资源
      最近更新 更多