如何从FTP服务器读取多行响应?

时间:2015-03-19 18:31:36

标签: ftp ftp-client unix-socket

我在C中编写FTP客户端程序。我使用阻塞套接字。我已将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:
                     webmaster@mincyt.gov.ar

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

但它只是打印:

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

1 个答案:

答案 0 :(得分:2)

您的代码从服务器读取一行(由\r\n终止的字符串)。

但根据FTP规范,FTP响应可以是多行的。

请参阅RFC 959, section 4.2 FTP Replies

  

因此,多行回复的格式是第一行            将以确切的所需回复代码开头,紧随其后            紧接着一个连字符,“ - ”(也称为Minus),然后是            文本。最后一行将以相同的代码开头,然后是            立即由Space,可选的一些文本和Telnet            行尾代码。

     

例如:

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

然后,用户进程只需要搜索第二个            发生相同的回复代码,后跟(Space),at            一行的开头,并忽略所有中间行。如果            中间线以3位数字开头,即服务器            必须垫在前面以避免混淆。


另见How to know the end of FTP Welcome message