столкнулся с проблемой - после перехода в пассивный режим данные не передаются.
вот код(значительно сокращенный и упрощенный, оставил только самую суть):
Код:
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
в чем проблема не понимаю...