Socket_select:它会影响它的输入,但究竟如何呢?

时间:2012-04-23 16:37:00

标签: php sockets netcat

在列出的here的php文档中,有一个迹象表明该函数使用read,error和write数组值作为refference,但我无法找到这些值中实际更改的任何位置。

我写了一个简单的'服务器',我现在使用,并且我注意到当提到的函数无法在轮询的客户端上看到任何数据时,它会更改数组并使其无法再次轮询。这是我的代码:

<php - all socket creation binding and listening above..
socket_set_nonblock($mysock);

$w = $e = array();
$clients = array($mysock);

do {
    $temp_client = @socket_accept($mysock);
    if ($temp_client != FALSE) 
        $clients[] = $temp_client;

    $clients_backup = $clients;

    $select_socket = socket_select($clients,$w,$e,0);
    if (($select_socket !== FALSE) AND ($select_socket != 0)) {
        foreach ($clients as $value) {
            $input = socket_read($value,1024,PHP_BINARY_READ);
            echo $input;
        }
    }
    $clients = $clients_backup;
} while(TRUE);

在测试时考虑到第一个连接没有被处理..我不知道为什么(非常感谢elightment)这个代码是我正在开发的一个条带,并且它工作正常。 socket_select问题在两个代码中保持不变。

基本上如果我没有对客户端数组进行备份,则它不起作用。错误:“没有资源数组被传递给select”,因为在socket_select首次检查没有要读取的数据的连接之后,数组没有套接字资源。

1 个答案:

答案 0 :(得分:4)

这些数组是套接字资源的数组。 socket_select()将通过从中删除任何未准备好分别读取,写入等的资源来修改数组。

您几乎总是想要传递数组的副本,因为它们会被修改,您不希望丢失对它们的原始引用:

$clients = [ ... ];
$r = $w = $e = $clients;

$numChanged = socket_select($r, $w, $e, ...);

// Here, $r, $w, and $e will only contain the resources that are ready for processing, which may be none at all