// 建立到真实服务器的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); // $listen_sock的可读数据是因为有新连接,已经处理了。暂时去掉,因为下面开始处理数据转发 //select->remove( $listen_sock ); } else { // 读取数据,失败则从轮询socket中删除,并关闭socket $client_data = @socket_read($socket, 1024, PHP_NORMAL_READ); if ($client_data === false) { socket_close($socket); $select->remove($socket); echo "client disconnected.<br />"; continue; } // 如果socket在$socket_maps1的key中,说明是从客户端读到了数据 if (in_array($socket, array_keys($socket_maps1))) { //echo "readed from client.<br />"; if (!socket_write($socket_maps1[$socket], $client_data)) { socket_close($socket); socket_close($socket_maps1[$socket]); $select->remove($socket); $select->remove($socket_maps1[$socket]); print "Write to server error.<br />"; } print htmlentities($client_data) . "</b><br />"; } elseif (in_array($socket, array_keys($socket_maps2))) {