#!/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 不是很理解。不太明白是什么意思。谢谢
<?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 不是很理解。不太明白是什么意思。谢谢
==========================
对,那个意思是缓冲的队列数。
但这个缓冲队列有什么作用。
就手册上的程序来说。使用php命令方式的运行。
然后打开命令提示符,输入
telnet XXX.XXX.XXX.XXX 10000
这时候会连接上去。
但是你在打开一个打开命令提示符 ,输入 telnet XXX.XXX.XXX.XXX 10000
这个时候应该就放到缓冲队列了吧??
这时我断开第一个连接,好,第2个连接就连接上了。这应该可以证明第2个连接是放到缓冲队列中了吧?
但是缓冲队列满了呢?怎么去处理后面的连接?丢掉?
我上面定义的是5个,那么可以有5个缓冲连接。
那我依次打开7个连接。然后依次断开连接,发现在第5个以后的连接还能连接上?这是怎么回事,第6,7 的连接放在哪?
发现在短时间内依次断开连接,发现第7个可以连接的如果打开的7个命令提示符,等一段时间,在依次断开各个连接。发现第7个连接不上了。因为队列已经满了。原因是什么?
我自己估计,可能是telnet 连接不上的话,在继续连接,但有个时间限制,超过这个时间还没有连接上就丢掉了。
不知道这个估计对不对?