прога на php [работа с ftp через сокеты]

Автор soul, 14 января 2008, 23:30:42

0 Пользователи и 1 Гость просматривают эту тему.

soul

Используя сокеты, написать программу, составляющую и выводящую
пользователю древовидную структуру FTP-сервера, находящемуся
по введенному пользователем адресу, используя указанные пользователем
имя пользователя (логин), пароль и порт. По умолчанию предусмотреть
вход под анонимным пользователем и стандартным портом. Подсчитать
суммарный размер файлов, доступных на FTP-сервере.

Программа должна включать в себя контроль ошибок при вводе, запросах и
обработке полученной информации.

При обработке информации файлами, являющимися символическими ссылками,
пренебречь.

если не сдам прогу - недопуск до экза, а очень бы хотелось сессию закрыть ))

есть вот такой текст проги, забракованный преподом за то, что используются стандартные функции, а надо "работать через сокет"...
она же ZолотаЯ

digger

Короче, написать фтп-клиент на php, без использования функций ftp.
Каков бюджет?

soul

#2
я хз че там надо ха клиент написать... надо, чтобы прога считывала инфу с сервера и все... бюджет надо обсудить с подругой (лаба одна на двоих) примерно на сколько можно рассчитывать?, но время сугубо ограничено - до 18 января...

блин, ну я даже примерно не знаю сколько за такие вещи денег берут... сколько надо???
она же ZолотаЯ

soul

нашла нужную программу на perl. осталось переписать с perla на php...
ну не могу я это сама сделать! а надо до такой степени, что хоть вешайся!
может все же кто-нить возьмется?
она же ZолотаЯ

digger

На собранные деньги купите учебнег по php.

soul

спасибо большое, за оказанную моральную поддержку
ладно хоть нашлись люди, не столь безраличные...
если вдруг кому в будущем понадобится эта прога - стучитесь в личку - не жалко.
она же ZолотаЯ

digger

Цитата: soul от 17 января 2008, 22:15:31если вдруг кому в будущем понадобится эта прога - стучитесь в личку - не жалко.
А в паблик жалко?

soul

в паблик тоже не жалко. но прога пока еще сырая, ибо написна наполовину мной )
ее сегодня подредактируют - могу выложить. хотя сомневаюсь, что у народа появится особая нужда в этой программке.
она же ZолотаЯ

soul

#8
вот код:


"
error_reporting(E_ERROR);

set_time_limit(450);

//читаем данные из сокета
//делаем операцию несколько раз, т.к. мы используем не блокирующий режим
//следовательно, если мы выполним операцию ранее, чем пришел ответ, то получим
//пустое значение
function sock_read($i=0)
{
   global $sock;
   $s = fgets($sock);
   if($s=='')
   {
      if($i==30)
      {
         break;
      }
      else
      {
         sleep(1);
         return sock_read($i+1);
      }
   }
   return $s;
}


//проверяем, нормально ли прошла последняя операция
//код ошибки сервера начинается с 5**
function is_ok()
{
   global $message;
   $s = sock_read();
   $message = $s;
//   echo $message;
   if($s == "" || preg_match('/^5/',$s) )
   {
      return 0;
   }
   else
   {
      return 1;
   }

}

//запись команды в сокет
function sock_write($s)
{
   global $sock;
//   echo "< $s\n";
   fputs($sock,"$s\n");
}


//делаем листинг каталога
function dir_list($sock,$data_sock, $path="", &$size)
{
   global $sock;
   $s="";
         $data_sock = pasv($sock);
   if ($data_sock)
   {

   sock_write("LIST");
   is_ok();

      if(is_ok())
      {
         while(true)
         {
            $line = fgets($data_sock);
            $s .= $line;
            if($line =='')
               break;
         }
         $dir = getFilesArray($s);
         echo "
    ";

             foreach ($dir as $key => $value)
             {
       
                if (($value[8]!=".") && ($value[8] !=".."))
                {
                   echo "
  • ".$value[8];
                   if ( substr($value[0],0,1) == "d")
                   {                 
                      sock_write("CWD $value[8]");
                      is_ok();
                      dir_list($sock, $data_sock, $value[8],$size);
                      sock_write("CWD ..");
                      is_ok();
                   }
                   echo "
  • ";
                   $size+=$value[4];
                }
             }
             echo "
";
      }



   }
   return $s;
}



//переход в пассивный режим
function pasv($sock)
{
   global $message, $hostname,$user,$password;
   sock_write("PASV");
   if(is_ok())
   {
      $offset = strpos($message,"(");
         
      $s = substr($message,++$offset,strlen($message)-2);
      $parts = split(",",trim($s));
      $data_host = "$parts[0].$parts[1].$parts[2].$parts[3]";
      $data_port = ((int)$parts[4] << 8) + (int) $parts[5];
   
      $data_sock = fsockopen($hostname,$data_port,&$errno,&$errstr,30);
      return $data_sock;
   }
   return "";
}


//возвращает массив с данными о файлах по входной строке, возвращенной из ответа сокета
function getFilesArray($s)
{
   $list = split("\n",$s);

   $pattern = "/[dwrx\-]{10}/";
   $dir = array();
   $i = 0;

      foreach($list as $file)
      {
         if ($file != "")
         {
            $file = preg_split("/ /",$file,20,PREG_SPLIT_NO_EMPTY);
            $dir[$i] = $file;
            $i++;
         }
      }
   return $dir;
}

$message = "";

//данные для соединения

$hostname = "";
$user = "";
$password  = "";

$sock = fsockopen($hostname ,21,&$errno,&$errstr,30);
set_socket_blocking($sock,false);

if($sock)
{
   if(is_ok())
   {
      sock_write("user $user");

      if(is_ok())
      {
         sock_write("pass $password");
         is_ok();
         $data_sock = pasv($sock);
         $size = 0;
         dir_list($sock,$data_sock,"",$size);
         echo "Суммарный размер файлов: ".$size;
      }
   }
}

?>"
она же ZолотаЯ

Нет_я

за команду

break;

отдельное спасибо. напомнило:

if (true != false){

}
нет)я