Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> FTP сервер 
:(
    Опции темы
m3mfis
Дата 10.5.2009, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 3.5.2009

Репутация: нет
Всего: нет



Нужно было написать простейщий фтп сервер на усвоение работы socket -ов. Он у меня делает авторизацию, переходит в пассивный режим и должен выдавать список файлов в текущей дир.. Но после того как выдает список он подвисает будто ожидает какой-то комманды или еще чего. Может чего упустил? 

Содержимое основного скрипта:
Код

<?php
    header('Content-Type: text/plain;');
    echo "Server\n\n";
    set_time_limit(0);
    ob_implicit_flush();
    include('socket.php');
    $user = 123;
    $pass = 123;
    $log_u=0;
    $log_p=0;
    $login=FALSE;
    echo 'Accept socket ... ';
    if (($msgsock = socket_accept($sock)) == 0) 
       {
        echo "errors";throw new Exception('socket_accept() failed: '.socket_strerror(socket_last_error())."\n");
       } else {
        echo "OK\n";
        $msg = "220 Welcome to FTP Server\r\n";
        socket_write($msgsock, $msg, strlen($msg));
        do
        {
            $buf = socket_read($msgsock, 1024);
            echo 'Client said: '.$buf;
            $buf=trim($buf);
            $command=explode(" ", $buf);
            if($command[0]=='USER'){
                $log_u=$command[1];
                $msg="331 Password required for $log_u\r\n";
                socket_write($msgsock, $msg, strlen($msg));
                $t_user=TRUE;
            }
            elseif(($command[0]=='PASS') &&($t_user==TRUE)){
                $log_p=$command[1];
                if(($user==$log_u)&&($pass==$log_p)){
                    $login=TRUE;
                    $msg="230 User $log_u logged in.\r\n";
                    socket_write($msgsock, $msg, strlen($msg));
                }else{$msg="530 Login incorrect.\r\n";socket_write($msgsock, $msg, strlen($msg));}
 
                
            }

            elseif($login==TRUE){
         if($command[0]=='SYST'){$msg="215 UNIX Type: L8\r\n";socket_write($msgsock, $msg, strlen($msg));}
            elseif($command[0]=='NOOP'){$msg="200 NOOP command successful.\r\n";socket_write($msgsock, $msg, strlen($msg));}
            elseif($command[0]=='PORT'){$msg="502 \r\n";socket_write($msgsock, $msg, strlen($msg));}
            elseif($command[0]=='STAT'){$msg="200 \r\n";socket_write($msgsock, $msg, strlen($msg));}
            elseif($command[0]=='CLOSE'){socket_close($sock);$msg="200 \r\n";socket_write($msgsock, $msg, strlen($msg));}
            elseif($command[0]=='FEAT'){$msg="211-Features:\r\n211 End\r\n";socket_write($msgsock, $msg, strlen($msg));}
            elseif($command[0]=='PWD') {/* $dir=getcwd(); */$dir="257 /";$msg=$dir."\r\n";socket_write($msgsock, $msg, strlen($msg));}
            elseif($command[0]=='EPSV'){$msg="502 - sadas\r\n";socket_write($msgsock, $msg, strlen($msg));}
            elseif($command[0]=='EPRT'){$msg="502 - sadas\r\n";socket_write($msgsock, $msg, strlen($msg));}
            elseif($command[0]=='LIST'){
            $msg="150 Opening ASCII mode data connection for '/bin/ls'.\r\n";
            socket_write($msgsock, $msg, strlen($msg));
                     $dir=shell_exec("ls -l");
                     $msg=$dir;//."\r\n";
                     echo $msg;
                     socket_write($msgsock1, $msg, strlen($msg));
                     socket_close($sock1);
                     $msg= "226 End of Status"."\r\n";
                     socket_write($msgsock, $msg, strlen($msg));
                     
                     //socket_write($msgsock, $msg, strlen($msg));//}
            }
            elseif($command[0]=='PASV'){
            //include('socket_pasv.php');
            
            
            $pasv=0;
                  $pasv++;
                  $pasv_port=rand(1024,65535);
                  echo $pasv_port;
                  $ra=dechex($pasv_port);
                  $p1=$ra[0].$ra[1];
                  $p2=$ra[2].$ra[3];
                  $p1=hexdec($p1);
                  $p2=hexdec($p2);
        echo 'Create socket ... ';
            if (($sock1 = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {echo "errors";} else {echo "OK\n";}
        echo 'Bind socket ... ';
            if (($ret = socket_bind($sock1, $address, $pasv_port)) < 0) {echo "errors";} else {echo "OK\n";}
        echo 'Listen socket ... ';
            if (($ret = socket_listen($sock1, 5)) < 0) {echo "errors";} else {echo "OK\n";}
            
            
            $msg="227 Entering Passive Mode (127,0,0,1,$p1,$p2)\r\n";
            socket_write($msgsock, $msg, strlen($msg));
            echo 'Accept socket ... ';
            if (($msgsock1 = socket_accept($sock1)) == 0) {echo "errors";} else {echo "OK\n";
            //$msg="150 Opening ASCII mode data connection for '/bin/ls'.\r\n";
            //socket_write($msgsock, $msg, strlen($msg));
             }
            }
                           elseif($command[0]=='QUIT'){
            break;
            }
            }
         
        }while(1);
       } 
        socket_close($sock); 
?>



Содержимое socket.php
Код

<?php
        $address = 'localhost';
        $port=rand(10000,10100);
        echo 'PORT: '.$port;
        echo 'Create socket ... ';
        if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) == 0) {
            echo "errors";//throw new Exception('socket_create() failed: '.socket_strerror(socket_last_error())."\n");
        } else {
            echo "OK\n";
        }

        echo 'Bind socket ... ';
        if (($ret = socket_bind($sock, $address, $port)) == 0) {
            echo "errors";exit;throw new Exception('socket_bind() failed: '.socket_strerror(socket_last_error())."\n");
        } else {
            echo "OK\n";
        }
     
        echo 'Listen socket ... ';
        if (($ret = socket_listen($sock, 5)) == 0) {
          echo "errors"; throw new Exception('socket_listen() failed: '.socket_strerror(socket_last_error())."\n");
        } else {
            echo "OK\n";
        }
        
      
?>


PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0408 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.