【问题标题】:Implementing FTP Server/Client in C用 C 实现 FTP 服务器/客户端
【发布时间】:2014-02-26 20:33:09
【问题描述】:

我被要求完成一项需要实现 FTP 协议的任务。我已经阅读了RFC959 提供的文档。

我对一些实现细节感到困惑

1)如果需要传输文件,可以使用什么功能。可以将简单的 send() 函数用于非文本文件吗?

2) 是否有可能获得一个关于实现模式和文件结构的好教程,并指定哪些是必不可少的。

希望尽快得到答复。

【问题讨论】:

  • 我认为客户端发送文件的字节然后在最后合并所有内容(通过服务器)
  • 您可以做的是将您的文件分成小块并在服务器上一一发送。服务器同时使用所有块重建整个文件。
  • (1)的答案是肯定的。 (2) 离题了。

标签: c sockets ftp network-programming ftp-server


【解决方案1】:

FTP 通过普通的 TCP 连接传输文件,您可以使用它传输任何类型的文件。文本文件和二进制文件没有区别,都是字节序列。

对于文件传输就足以打开一个连接并多次调用write函数,直到整个文件传输完毕(查看write的返回值就知道它发送了多少字节)。

FTP 协议的其余部分是基于文本的,并被发送到不同的端口。

有一个good tutorial 直接通过netcat 使用FTP,这对于了解事情的工作原理很有用。了解active and passive mode 也很有用,因为您至少要实现其中一个。

此外,使用wireshark 跟踪TCP 流并查看您正在发送/接收的数据,它在调试时非常有用。

【讨论】:

  • write() 将字符缓冲区作为输入。是否可以使用write() 发送图像文件或任何其他二进制文件,我是否需要打开rb 之类的文件,或者r 是否足够? @fede1024
  • 还给定write() 允许的最大长度是1 GB,仍然有必要或“建议”只发送几个字节,比如一次100 或512 个字节吗? @fede1024
  • 字符缓冲区仅表示字节缓冲区,您可以将 0 到 255 之间的任何值存储在 char 中(当然,如果您尝试将其打印为 ASCII 字符,它可能会给您带来奇怪的符号)。在 Linux 上,是否使用 b 标志没有区别,但我还是会这样说,因为在其他平台上可能会有所不同。使用小缓冲区,只需几 Kb 即可。
  • 要发送文件,你应该看看sendfile
【解决方案2】:

协议实现不会为您提供文件结构。协议在这里定义一些规则和状态。

dev/prog 部分由您决定。您只需要尊重 FTP 协议即可获得规范化和与其他客户端/服务器的兼容性。

最好的问候

【讨论】:

    最近更新 更多