ftp через сокеты

fantom_uzb

Новичок
ftp через сокеты

Не могу понять, почему скрипт не доходит до конца (feof)...
Сначала чтение в переменную происходит нормально, но как достигается конец, скрипт останавливается (не выходит из цикла while). Подскажите пожалуйста, в чём у меня ошибка...
Заранее благодарен...

использую php 5.1.1

PHP:
$fp = fsockopen("ftp.stream.uz", 21, $errno, $errstr, 60); 
if (!$fp) {
  	echo "$errstr ($errno)<br />\n";  } else {
    	fwrite($fp, "USER anonymous");
  	while (!feof($fp)) { 
 		$qwe .= fgets($fp, 128); 
 	}  	
echo $qwe."<br>"; 
$qwe = "";
 

fantom_uzb

Новичок
Автор оригинала: SiMM
[m]feof[/m]
это ведь с http работает...
После запроса ведь приходит ответ, который я пытаюсь прочитать, в чём тогда проблема...
Подскажите пожалуйста...

-~{}~ 25.12.05 13:35:

Я понял свою ошибку:
ftp сервер не закрывает соединие в отличие от http
 

SiMM

Новичок
> в чём тогда проблема
В протоколе.
Если подключение, открытое при помощи fsockopen() не было закрыто сервером, feof() будет ждать достижения таймаута прежде чем вернуть TRUE.
 

fantom_uzb

Новичок
есть команда REST (аналогичная Range в http), можно ли с помошью этой команды получить часть файла (например первые 50 байт)...
 

SiMM

Новичок
А почему нет? Если FTP-сервер поддерживает.
А вообще - почему бы не воспользоваться [m]ftp_get[/m] и не опускаться до уровня fsockopen?

> есть команда REST
А она разве имеет в качестве аргумента конец читаемого блока? Там же вроде только начало можно указать. А так - прочти 50 байт да закрой соединение.
 

fantom_uzb

Новичок
Автор оригинала: SiMM
А почему нет? Если FTP-сервер поддерживает.
А вообще - почему бы не воспользоваться [m]ftp_get[/m] и не опускаться до уровня fsockopen?

> есть команда REST
А она разве имеет в качестве аргумента конец читаемого блока? Там же вроде только начало можно указать. А так - прочти 50 байт да закрой соединение.
На хостинге все фтп функции закрыты, поэтому не могу использовать ftp_get :((
Вы предлагаете прочитать 50 байт, а потом закрыть соединение... Я нигде не могу найти, как узнать, что передано 50 байт (хотя сейчас попробую fgets)...
 

white phoenix

Новичок
fantom_uzb
[m]fgets[/m] не нужно использовать для таких целей, используй [m]fread[/m]:
PHP:
$data .= fread($fp,50);
 

fantom_uzb

Новичок
Простите за длинный код...
На последнем шаге (RETR /pub/Images/AMIR TEMUR MUZEYI.jpg) происходит какая-то ошибка...
Сервер не присылает ответ...
Команды брал из FlashGet'a... По идее всё должно работать...

PHP:
$fp = fsockopen("ftp.stream.uz", 21, $errno, $errstr, 60);
if (!$fp) {
	echo "$errstr ($errno)<br />\n";
} else {

	$qwe = fread($fp, 1024);
	echo $qwe;

	fwrite($fp, "USER anonymous\n");
	$qwe = fread($fp, 1024);
	echo $qwe."<br>";

	fwrite($fp, "TYPE I\n");
	$qwe = fread($fp, 1024);
	echo $qwe."<br>";

	fwrite($fp, "PASV\n");
	$qwe = fread($fp, 1024);
	echo $qwe."<br>";

	// читает и выводит размер файла
	fwrite($fp, "SIZE /pub/Images/AMIR TEMUR MUZEYI.jpg\n");
	$qwe = fread($fp, 1024);
	echo $qwe."<br>";
	
	fwrite($fp, "REST 91980\n");
	$qwe = fread($fp, 1024);
	echo $qwe."<br>";
	
	fwrite($fp, "RETR /pub/Images/AMIR TEMUR MUZEYI.jpg\n");
	$qwe = fread($fp, 10);
	echo $qwe."<br>";
}
 

Profic

just Profic (PHP5 BetaTeam)
Команды брал из FlashGet'a...
Кроме тупого копирования комманд из качалки нужно понимать, что они означают. Для этого есть описание протоколов (RFC). В данном случае тебе нужно описание протокола FTP (номера этого RFC к сожалению не помню). Так вот, FTP протокол, это вам батенька не немного модицицированный HTTP. Он в отличии от последнего использует ДВА соединения: одно для комманд, второе для передачи данных.
 

fantom_uzb

Новичок
Автор оригинала: Profic
Кроме тупого копирования комманд из качалки нужно понимать, что они означают. Для этого есть описание протоколов (RFC). В данном случае тебе нужно описание протокола FTP (номера этого RFC к сожалению не помню). Так вот, FTP протокол, это вам батенька не немного модицицированный HTTP. Он в отличии от последнего использует ДВА соединения: одно для комманд, второе для передачи данных.
Что ftp использует 2 соединения, я уже понял :))
Проблема в том, как создать второе...
Это лог CuteFTP

COMMAND:> RETR AMIR TEMUR MUZEYI.jpg
STATUS:> Connecting FTP data socket 217.29.116.196:27065...
150-Accepted data connection
150 708.3 kbytes to download

Для открытия второго соединения мне надо будет опять коннектиться к сокету, но уже по 27065 порту ???
Или это делается как-то по другому ???
 
Сверху