【问题标题】:How to read multiline response from FTP server?如何从 FTP 服务器读取多行响应?
【发布时间】:2015-05-23 00:37:19
【问题描述】:

我正在用 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) 向我们展示您的代码! 2) 它不会在某些服务器上读取整个消息:那么它读取的是什么? 3) 包含字符 '\r' '\n' 一起:这是什么意思?
  • 我已经编辑了这个问题。请注意。

标签: ftp ftp-client unix-socket


【解决方案1】:

您的代码从服务器读取一行(以\r\n 结尾的字符串)。

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

RFC 959, section 4.2 FTP Replies

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

例如:

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

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


另见How to know the end of FTP Welcome message

【讨论】:

  • 谢谢。这真的很有帮助。
猜你喜欢
  • 2021-09-15
  • 2021-11-11
  • 1970-01-01
  • 1970-01-01
  • 2020-07-10
  • 1970-01-01
  • 2012-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多