Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Компьютеры + Интернет » Вебмастеру » ftp сервер php

Ответить
Настройки темы
ftp сервер php

Старожил


Сообщения: 236
Благодарности: 0

Профиль | Отправить PM | Цитировать


народ поможите, нужно не тривиальное решение.

как на php создать мини ftp сервер - чтобы к нему можно было соединится и сделать ls и все.

т.е. я не представляю как можно заставить работать вот это:

пуск->выполнить->ftp->open domen.ru/ftp.php

и что должно быть внутри этого файла чтобы понять что к нему стукнули из cmd допустим?

т.е. какое условие if для начала работы файла на сервере чтобы вернуть ответ..

Отправлено: 03:01, 29-03-2007

 

Аватара для vadimiron

Ветеран


Сообщения: 1864
Благодарности: 120

Профиль | Отправить PM | Цитировать


Цитата:
пуск->выполнить->ftp->open domen.ru/ftp.php
Так и не получится.
Смысл всех сетевых серверов: они "бегут всегда" и висят на каком то порте. FTP например занимает 21 порт (но можно и другой порт). Любой такой сервер является сокет сервером. То есть он ждёт входящие сообщения на данном порту, обрабатывает запросы и посылает ответ. И естественно должен быть мультиюзерный.

Если захотите, могу скинуть пример тривиального сокет сервера. Всё что нужно сделать, так это имплементировать протокол FTP, то есть эти самые команды.

Ну и запускаться такой сервер естественно не через Apache и просто с помощью php.exe, то есть апач и не нужен

-------
Fortes fortuna adiuvat


Отправлено: 12:02, 29-03-2007 | #2



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

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 1862
Благодарности: 132

Профиль | Сайт | Отправить PM | Цитировать


FADE
Тебе это зачем?

-------
ДИЛЕТАНТ - это курьезный человек, который испытывает удовольствие делать то, чего не умеет.
AMD 4200+, MSI Neo2Platinum, 2Gb, ATI 9600, D-Link DWL-G510, FreeBSD 8.0, KDE 4.3.4


Отправлено: 20:17, 29-03-2007 | #3


Старожил


Сообщения: 236
Благодарности: 0

Профиль | Отправить PM | Цитировать


vadimiron
Цитата:
Всё что нужно сделать, так это имплементировать протокол FTP
да, именно это и нужно, но не все команды а достаточно: соединение, закрытие соединения и ls,

но я всетаки не понял а как привязать ftp.php на 21 и чтобы через пуск->выполнить->ftp->open domen.ru оббатывался этот файл?

пример внутриности обработки ftp команд сокет сервера на php с удовольствием посмотрел бы

Igor_I ОЧ надо...
ну и интересно

Отправлено: 22:01, 29-03-2007 | #4

mar mar вне форума

Аватара для mar

just mar


Moderator


Сообщения: 3904
Благодарности: 163

Профиль | Отправить PM | Цитировать


FADE
Цитата:
но я всетаки не понял а как привязать ftp.php на 21 и чтобы
это как раз и есть работа с сокетами ) Если vadimiron скинет тебе пример, там это (только со своим портом) должно быть в явном виде. Документацию по работе с сокетами дать? Только предупреждаю, там все расписано для C.

Отправлено: 22:22, 29-03-2007 | #5


Старожил


Сообщения: 236
Благодарности: 0

Профиль | Отправить PM | Цитировать


mar
Цитата:
Документацию по работе с сокетами дать?
мне бы на пальцах, что куда прописать чтобы привязать ftp.php на 21 порт...

Отправлено: 01:36, 30-03-2007 | #6


Старожил


Сообщения: 236
Благодарности: 0

Профиль | Отправить PM | Цитировать


vadimiron
Цитата:
Ну и запускаться такой сервер естественно не через Apache и просто с помощью php.exe
объясни на пальцах пожалуйста, что делать...

Отправлено: 18:45, 30-03-2007 | #7


Аватара для vadimiron

Ветеран


Сообщения: 1864
Благодарности: 120

Профиль | Отправить PM | Цитировать


FADE
Вот примитивный мультиюзерный сокет сервер, он умеет только отвечать, что сказал ему клиент, то есть echo-server:
PHP код: Выделить весь код

<?

// don't timeout
set_time_limit(0);

define("IP","127.0.0.1");
define("PORT",11000);
$NULL=NULL;

$server=socket_create(AF_INET,SOCK_STREAM,0) or die(socket_strerror(socket_last_error()));


socket_bind($server,IP,PORT) or die(socket_strerror(socket_last_error()));

socket_listen($server) or die(socket_strerror(socket_last_error()));


$clients=array($server);


while(
TRUE)
{
    
$read=$clients;
    
    
$num_changed_clients=socket_select($read,$NULL,$NULL,NULL);
    if(
$num_changed_clients<1) continue;

    if(
in_array($server,$read))
    {
        
$new_client=socket_accept($server);
        
$clients[]=$new_client;
        echo 
"New Client ist here\n";
        
socket_write($new_client,"Hallo\n",strlen("Hallo\n"));
        
$key=array_search($server,$read);
        unset(
$read[$key]);
    }
    
    

    foreach(
$read as $k=>$read_sock)
    {
        
$msg=@socket_read($read_sock,512);
        
        if(
$msg!==false$msg=trim($msg);
        
                                
//here your server commands
        
if($msg===false || $msg=="end")
        {
            
$key=array_search($read_sock,$clients);
            unset(
$clients[$key]);
            echo 
"Client is gone away\n";
        }        
        else 
        {
            echo 
"client said: ".$msg."\n";
            
$msg="Server->".$msg."\n";
            
socket_write($read_sock,$msg,strlen($msg));
        }
    }

}


socket_close($server) or die(socket_strerror(socket_last_error()));

fputs(STDOUT,"\nAny button to close....");
?>

Все клиенты управляются в array-e $clients. При каждом пробеге while проверяется статус клиентов.
Сервер висит на 127.0.0.1 и в кчестве порта я выбрал 11000, хотя можно и другие.

А вот пример клиента для тестов:
PHP код: Выделить весь код

<?

set_time_limit
(0);

while(
TRUE)
{
    
$command=fgets(STDIN,128);
    
    
$command=trim($command);
    
    switch(
$command)
    {
        case 
"con":
        case 
"connect":
            
fwrite(STDOUT,"Host: ");
            
$host=fgets(STDIN,128);
            
fwrite(STDOUT,"Port: ");
            
$port=fgets(STDIN,128);
            
            
$host=trim($host);
            
$port=trim($port);
            
            
$fp fsockopen($host$port$errno$errstr,10);
            if (!
$fp)
            {
                
fwrite(STDOUT,"No connection\n");
            }
            else
            {
                
$msg=fgets($fp128);
                
fwrite(STDOUT,$msg."\n");
    
                
                
$msg=fgets(STDIN,128);
                
$msg=trim($msg);
                while (
$msg!="end")
                {
                    
$out=$msg;
                    echo 
"Writing....\n";fwrite($fp$out,strlen($out));
                    echo 
"Geting Answer....\n";$answer=fgets($fp128);
                    echo 
"Writing Answer.....";fwrite(STDOUT$answer."\n");echo "....\n";
                    
                    
$msg=fgets(STDIN,128);
                    
$msg=trim($msg);
                }
                
fclose($fp);
            }
            break;
        
            
        case 
"quit":
            break 
2;
        default: 
            
fwrite(STDOUT,$command);
            break 
2;
    }


}

fwrite(STDOUT,"Bye-Bye");
?>

Войдя в клиент надо набрать connect, после этого клиент спрашивает какой IP и Порт у сервера, и если он удачно подключается, то получает сообщение от сервера "Hallo", далее можно писать всё что угодно, сервер будет всё возвращать назад. Комманда end клиента разрывает связь.

Сервер покаа конечно не стабилен, есть ошибки, но в целом уже рабочий и может работать с несколькими клиентами одновременно.

Чтобы организовать FTP, вам придётся точно выучить, как выглядит запрос-ответ тех комманд, которые вам нужно реализовать.
А также тестить-тестить-тестить

Запустить сервер и клиент можно нажав правой кнопкой на файле, далее "открыть с..." (или как там в русской Винде), далее найти php.exe и открыть, далее сервер или клиент появятся обычным cmd-окошком

-------
Fortes fortuna adiuvat


Отправлено: 13:17, 02-04-2007 | #8

mar mar вне форума

Аватара для mar

just mar


Moderator


Сообщения: 3904
Благодарности: 163

Профиль | Отправить PM | Цитировать


еще, напоминаю, что для работы по ftp используются 2 канала по двум портам

Отправлено: 15:54, 02-04-2007 | #9


Аватара для vadimiron

Ветеран


Сообщения: 1864
Благодарности: 120

Профиль | Отправить PM | Цитировать


Цитата:
еще, напоминаю, что для работы по ftp используются 2 канала по двум портам
То есть другими словами надо занимать оба порта и создать как бы два сокет сервера в одном флаконе

-------
Fortes fortuna adiuvat


Отправлено: 16:46, 02-04-2007 | #10



Компьютерный форум OSzone.net » Компьютеры + Интернет » Вебмастеру » ftp сервер php

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Бесплатный ftp-сервер andrejka k Вебмастеру 6 09-02-2015 22:42
[решено] php и ftp rus-4-ever Вебмастеру 10 29-10-2010 21:54
Suse/OpenSuSE - [решено] Apache2, FTP сервер Artem-Samsung Общий по Linux 17 28-08-2008 17:20
Прокси и/или FTP клиент на php pauluss Вебмастеру 2 09-08-2004 20:13




 
Переход