PHP socket_select()始终将套接字检测为可从中读取

达力克斯

我一直在寻找来解决这个问题的解决方案。似乎socket_select()总是会找到可接受的套接字(由socket_accept()返回的资源)以供读取,即使没有等待的数据包也是如此。我确定有些事情我忘了做,但是我不知道那是什么。

以下是相关代码:

while(TRUE){
    $read_sockets=$this->client_sockets;
    $write_sockets=NULL;
    $except=NULL;

    if(socket_select($read_sockets, $write_sockets, $except, NULL)<1) continue;
    foreach($read_sockets as $pending_socket){
        echo "Read request received...".PHP_EOL;

        if($this->socket==$pending_socket){
            $new_client_socket=socket_accept($this->socket);
            socket_write($new_client_socket,$this->read_data($new_client_socket),2048);
            $this->client_sockets[]=$new_client_socket;
            echo "New client...".PHP_EOL;
        } else {
            $pending_socket_data=$this->read_data($pending_socket);
            if($pending_socket_data===false){
                unset($this->client_sockets[array_search($pending_socket,$this->client_sockets)]);
                continue;
            }
            socket_write($pending_socket,$pending_socket_data,2048);
            echo "Old client...".PHP_EOL;
        }
    }
}

private function read_data(&$socket){
    echo 'Reading data...'.PHP_EOL;
        $client_data='';$tmp='';
    while(socket_recv($socket,$tmp,$this->max_length,0) > 0){
        $client_data .= $tmp;
    }
    return $client_data;
}

我知道我没有捕捉到一些异常,例如socket_recv === FALSE,但是此代码只是概念证明,我在调试主代码时必须认真研究。

$this->socket 是服务器套接字,并且是非阻塞的。

提前致谢!

沃克
private function read_data(&$socket){
    echo 'Reading data...'.PHP_EOL;
        $client_data='';$tmp='';
    while(socket_recv($socket,$tmp,$this->max_length,0) > 0){
        $client_data .= $tmp;
    }
    return $client_data;
}

方法read_data永远不会返回false,因此以下代码将永远不会运行。

if($pending_socket_data===false){
     unset($this->client_sockets[array_search($pending_socket,$this->client_sockets)]);
     continue;
}

socket_recv返回false,你应该检查socket_last_error()并决定是否要socket_close($pending_socket)unset($this->client_sockets[..])

socket_recv返回0时,可能是套接字关闭的,应该调用unset($this->client_sockets[..])

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

PHP socket_select()始终将套接字检测为可从中读取

来自分类Dev

是否保证php的socket_select()能够检测所有客户端套接字断开连接?

来自分类Dev

如何检测流套接字中的中止连接-PHP

来自分类Dev

C ++ IP服务器套接字始终从PHP套接字客户端接收“ 0100000001000000”

来自分类Dev

PHP:如何从套接字读取N个字节?

来自分类Dev

如何在套接字编程中从Server(server.java)socket连续侦听PHP(client.php)套接字

来自分类Dev

PHP侦听unix套接字

来自分类Dev

JS 到 PHP 套接字?

来自分类Dev

在 PHP 中关闭套接字

来自分类Dev

PHP套接字包数据

来自分类Dev

套接字php,php,慢速套接字,性能更好的套接字

来自分类Dev

PHP套接字编程-为什么在socket_accept($ sock)=== false上退出

来自分类Dev

如何从Java中的字节流读取(PHP / Java套接字通信)

来自分类Dev

如何从Java中的字节流读取(PHP / Java套接字通信)

来自分类Dev

PHP:无法从php-fpm连接到套接字

来自分类Dev

PHP套接字,无法连接-循环?

来自分类Dev

用尽用PHP的Curl套接字?

来自分类Dev

PHP套接字服务器挂起

来自分类Dev

PHP和C ++之间的套接字连接

来自分类Dev

带有Android的PHP套接字

来自分类Dev

如何通过php编写套接字代码

来自分类Dev

Strato Server PHP Zend PDOException套接字

来自分类Dev

PHP无法写入套接字?

来自分类Dev

PHP反复从TCP套接字接收数据

来自分类Dev

PHP多连接套接字(广播问题)

来自分类Dev

PHP套接字服务器挂起

来自分类Dev

PHP套接字连接-Telnet拒绝连接

来自分类Dev

PHP套接字和TCP IP命令

来自分类Dev

共享中央套接字对象的PHP线程

Related 相关文章

热门标签

归档