Новичок
Профиль
Группа: Участник
Сообщений: 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"; } ?>
|
|