$check_socks = array($listen_sock); // 映射客户端socket和服务端socket // $socket_maps1将客户端socket作为key // $socket_maps2将服务端socket作为key // 以内存换速度,并且方便下面的搜索 $socket_maps1 = array(); $socket_maps2 = array(); // 实例化select类 $select = new select($check_socks); while (true) { /* print_r( $socket_maps ); print "<br />"; */ // select轮询,超时2秒 foreach ($select->can_read(1) as $socket) { // listen_sock可读,说明有人连接上来了 if ($socket == $listen_sock) { // 接受新连接,并加入到轮训数组 $new_client = socket_accept($listen_sock); $select->add($new_client); socket_getpeername($new_client, $ip, $port); echo "New client connected: {$ip}, {$port}<br />"; // 建立到真实服务器的socket $server_sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_connect($server_sock, "127.0.0.1", $listen_port); // 建立真实服务器socket和真实客户端socket之间的映射关系 $socket_maps1[$new_client] = $server_sock; $socket_maps2[$server_sock] = $new_client; // 添加到select轮询中 $select->add($server_sock);