Как прочитать многострочный ответ с FTP-сервера?

Я пишу клиентскую программу FTP на C. Я использую блокирующий сокет. Я поместил recv () в цикл while и прерываю его, когда последние два полученных символа равны \r\n. Я могу запустить его на некоторых серверах, но на некоторых серверах, таких как ftp.secyt.gov.ar, он не читает сообщение целиком.

Я думаю, что проблема в сообщениях с сервера, которые содержат символы \r \n вместе.

Как мне поступить в таком случае?

После отправки имени пользователя и пароля на сервер ftp.secyt.gov.ar я хочу распечатать сообщение, полученное с сервера.

password = getpass("Password: ");
sprintf(pass, "PASS %s\r\n",password);

send(sockfd, pass, strlen(pass), 0);

while((no_of_bytes = recv(sockfd, message_from_server, MAXSZ, 0)) > 0)
{
    message_from_server[no_of_bytes] = '\0';
    printf("%s\n", message_from_server);

    if (message_from_server[no_of_bytes-2] == '\r' &&
        message_from_server[no_of_bytes-1] == '\n')
        break;
}

Сервер отправляет это сообщение:

230-=====================================================================

    BIENVENIDOS AL SERVIDOR FTP DE LA MINCyT   
             ----------------------------------------

Usuario anonymous, desde la maquina ::ffff:116.203.73.60, gracias por
utilizar el FTP del Ministerio de Ciencia, Tecnologia e
Innovacion Productiva.

Para sugerencias, consultas o informacin adicional nuestros correos 
electrnicos son:
                     [email protected]

=========================================================================
230 User anonymous logged in.

Но печатает только:

230-=====================================================================

person Rohit Takhar    schedule 19.03.2015    source источник
comment
1) Покажи нам свой код! 2) на некоторых серверах он не читает сообщение целиком: Итак, что он читает? 3) содержит символы '\r' '\n' вместе: что это значит?   -  person Martin Prikryl    schedule 20.03.2015
comment
Я отредактировал вопрос. Пожалуйста, позаботьтесь об этом.   -  person Rohit Takhar    schedule 20.03.2015


Ответы (1)


Ваш код считывает строку (строку, оканчивающуюся символом \r\n) с сервера.

Но ответ FTP может быть многострочным, в соответствии со спецификацией FTP.

См. RFC 959, раздел 4.2 FTP-ответы:

Таким образом, формат многострочных ответов таков, что первая строка начинается с точного требуемого кода ответа, за которым сразу следует дефис, - (также известный как минус), за которым следует текст. Последняя строка будет начинаться с того же кода, за которым сразу же следует пробел, необязательно текст и код конца строки Telnet.

Например:

 123-First line  
 Second line  
   234 A line beginning with numbers  
 123 The last line

Затем пользовательскому процессу просто нужно искать второе вхождение того же кода ответа, за которым следует (Пробел) в начале строки, и игнорировать все промежуточные строки. Если промежуточная строка начинается с 3-значного числа, Сервер должен дополнить ее, чтобы избежать путаницы.


См. также Как узнать конец приветственного сообщения FTP.

person Martin Prikryl    schedule 20.03.2015
comment
Спасибо. Это действительно помогло. - person Rohit Takhar; 20.03.2015