ftp клиент (отказывается передавать данные)

Модератор: Модераторы разделов

Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

ftp клиент

Сообщение RasenHerz »

пишу простенький ftp-клиент(лично для себя, так что истории о изобретении велосипеда просьба не рассказывать :rolleyes: ).
столкнулся с проблемой - после перехода в пассивный режим данные не передаются.
вот код(значительно сокращенный и упрощенный, оставил только самую суть):

Код:

int main(int argc, char *argv[]) { /* .... */ recv(sock, buff, B_SIZE-1, 0); // Читаю приветствие сервера strcpy(buff, "USER anonymous\n\0"); send(sock, buff, strlen(buff), 0); recv(sock, buff, B_SIZE-1, 0); strcpy(buff, "PASS anonymous\n\0"); send(sock, buff, strlen(buff), 0); recv(sock, buff, B_SIZE-1, 0); strcpy(buff, "SYST\n\0"); send(sock, buff, strlen(buff), 0); recv(sock, buff, B_SIZE-1, 0); strcpy(buff, "PWD\n\0"); send(sock, buff, strlen(buff), 0); recv(sock, buff, B_SIZE-1, 0); strcpy(buff, "TYPE I\n\0"); send(sock, buff, strlen(buff), 0); recv(sock, buff, B_SIZE-1, 0); strcpy(buff, "SIZE richard7.JPG\n\0"); send(sock, buff, strlen(buff), 0); recv(sock, buff, B_SIZE-1, 0); printf("%s", buff); int fsize = 0; parse_size_str(buff+3); //получаю из ответа сервера размер файла в виде строки sscanf(buff, "%i", &fsize); strcpy(buff, "PASV\n\0"); send(sock, buff, strlen(buff), 0); recv(sock, buff, B_SIZE-1, 0); strcpy(buff, "RETR richard7.JPG\n\0"); send(sock, buff, strlen(buff), 0); int fd = open("/home/negativ/richard7.JPG", O_RDWR|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IROTH); if (fd < 0){ perror("error opening file"); goto fail; } char *data = (char*)malloc(PG_SIZE); while(fsize>0){ len = recv(main_domain.socket, data, B_SIZE, 0); // Здесь последним параметром также пробовал MSG_WAITALL и MSG_DONTWAIT if(len <= 0){ perror("socket"); continue; } write(fd, data, len); fsize -= len; } strcpy(buff, "QUIT\n\0"); send(main_domain.socket, buff, strlen(buff), 0); fail: close(main_domain.socket); free(buff); return 0; }


Теперь кратко о происходившем)) : входим в систему как anonymous -> получаем служебную информацию(SYST, PWD и прочее) -> переключаемся в двоичный режим -> запрашиваем размер файла -> уходим в пассивный режим -> начинаем передачу файла.
вот вывод программы:

negativ@negativ.zet

220 Welcome to NegatiV-FTP Host USER anonymous 331 Please specify the password. PASS anonymous 230 Login successful. SYST 215 UNIX Type: L8 PWD 257 "/" TYPE I 200 Switching to Binary mode. SIZE richard7.JPG 213 25073 PASV 227 Entering Passive Mode (192,168,64,254,181,115) RETR richard7.JPG socket: Resource temporarily unavailable socket: Resource temporarily unavailable socket: Resource temporarily unavailable

в чем проблема не понимаю...
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: ftp клиент

Сообщение RasenHerz »

глянул исходники wget'a.
оказалось, что строка 227 Entering Passive Mode (192,168,64,254,181,115) содержит порт к которому надо будет потом подключится чтобы начать передачу. судя по-всему в данном случае это 115 порт).
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: ftp клиент

Сообщение diesel »

RasenHerz писал(а):
09.01.2009 02:55
глянул исходники wget'a.
оказалось, что строка 227 Entering Passive Mode (192,168,64,254,181,115) содержит порт к которому надо будет потом подключится чтобы начать передачу. судя по-всему в данном случае это 115 порт).

Код: Выделить всё

  227 Entering Passive Mode (h1,h2,h3,h4,p1,p2).

http://www.faqs.org/rfcs/rfc959.html
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: ftp клиент

Сообщение RasenHerz »

diesel писал(а):
09.01.2009 11:20
RasenHerz писал(а):
09.01.2009 02:55
глянул исходники wget'a.
оказалось, что строка 227 Entering Passive Mode (192,168,64,254,181,115) содержит порт к которому надо будет потом подключится чтобы начать передачу. судя по-всему в данном случае это 115 порт).

Код: Выделить всё

  227 Entering Passive Mode (h1,h2,h3,h4,p1,p2).

http://www.faqs.org/rfcs/rfc959.html

спасибо. спецификацию читал.
Спасибо сказали: