#!/usr/local/bin/php -q
<?php
error_reporting(E_ALL);/* Allow the script to hang around waiting for connections. */
set_time_limit(0);/* Turn on implicit output flushing so we see what we're getting
* as it comes in. */
ob_implicit_flush();$address = '192.168.1.53';
$port = 10000;if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
    echo "socket_create() failed: reason: " . socket_strerror($sock) . "\n";
}if (($ret = socket_bind($sock, $address, $port)) < 0) {
    echo "socket_bind() failed: reason: " . socket_strerror($ret) . "\n";
}if (($ret = socket_listen($sock, 5)) < 0) {
    echo "socket_listen() failed: reason: " . socket_strerror($ret) . "\n";
}do {
    if (($msgsock = socket_accept($sock)) < 0) {
        echo "socket_accept() failed: reason: " . socket_strerror($msgsock) . "\n";
        break;
    }
    /* Send instructions. */
    $msg = "\nWelcome to the PHP Test Server. \n" .
        "To quit, type 'quit'. To shut down the server type 'shutdown'.\n";
    socket_write($msgsock, $msg, strlen($msg));    do {
        if (false === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) {
            echo "socket_read() failed: reason: " . socket_strerror($ret) . "\n";
            break 2;
        }
        if (!$buf = trim($buf)) {
            continue;
        }
        if ($buf == 'quit') {
            break;
        }
        if ($buf == 'shutdown') {
            socket_close($msgsock);
            break 2;
        }
        $talkback = "PHP: You said '$buf'.\n";
        socket_write($msgsock, $talkback, strlen($talkback));
        echo "$buf\n";
    } while (true);
    socket_close($msgsock);
} while (true);socket_close($sock);
?> 
==============
上面是手册中的程序。
我对 $ret = socket_listen($sock, 5) 监听后面的参数5 不是很理解。不太明白是什么意思。谢谢

解决方案 »

  1.   

    A maximum of backlog incoming connections will be queued for processing
      

  2.   

    首先谢谢以上各位的回答。但还有疑问,请看:
    ==========================
    对,那个意思是缓冲的队列数。
    但这个缓冲队列有什么作用。
    就手册上的程序来说。使用php命令方式的运行。
    然后打开命令提示符,输入
    telnet XXX.XXX.XXX.XXX 10000
    这时候会连接上去。
    但是你在打开一个打开命令提示符 ,输入 telnet XXX.XXX.XXX.XXX 10000
    这个时候应该就放到缓冲队列了吧??
    这时我断开第一个连接,好,第2个连接就连接上了。这应该可以证明第2个连接是放到缓冲队列中了吧?
    但是缓冲队列满了呢?怎么去处理后面的连接?丢掉?
    我上面定义的是5个,那么可以有5个缓冲连接。
    那我依次打开7个连接。然后依次断开连接,发现在第5个以后的连接还能连接上?这是怎么回事,第6,7 的连接放在哪?
      

  3.   

    回答我上面的问题,
    发现在短时间内依次断开连接,发现第7个可以连接的如果打开的7个命令提示符,等一段时间,在依次断开各个连接。发现第7个连接不上了。因为队列已经满了。原因是什么?
    我自己估计,可能是telnet 连接不上的话,在继续连接,但有个时间限制,超过这个时间还没有连接上就丢掉了。
    不知道这个估计对不对?