编写ftp客户端程序以列出服务器上的文件的最佳方法是什么?

时间:2011-09-17 09:26:43

标签: c windows ftp client-server winsock2

我正在尝试在Windows中用C编写客户端 - 服务器程序。目标是从服务器接收目录列表。现在我试图以这种方式开发客户端服务器以利用大多数资源。

实现的一种方法是服务器进行单个send()调用以发送单个文件的信息。因此,如果有100个文件,则会进行100次调用。但我觉得这是网络资源的浪费。据我所知,windows中send()或recv()的缓冲区大小为8kb。但单个文件的信息将难以达到1kb。那么有没有办法让send()调用发送多个文件信息(文件信息存储在结构中。所以它们基本上形成一个链表)?也许我可以在一个Send()调用中发送至少8个文件的信息。这应该将send()调用总数减少到最大值13。

所以基本上有办法通过send()发送链表吗?如果你能想到任何替代方法,请告诉我。

3 个答案:

答案 0 :(得分:1)

好问题!为此+1。

但是你真的想要或者需要编写你的代码才能使用Winsock吗?有充分的理由这样做 - 包括它的乐趣和挑战。但是如果您不需要,您可能需要考虑使用libcurl ftp library,它是免费的,多平台的(当然包括win32),只是起作用,可能会让您的工作变得更轻松。

答案 1 :(得分:0)

我知道使用FTP执行此操作的唯一方法是使用多个连接到FTP服务器。如果服务器允许这样做,则可以提高列表性能,因为列出完整文件夹树所需的许多协议交换可以并行运行。

RGDS, 马丁

答案 2 :(得分:0)

TCP是一个字节流。我们无法保证您要发送的项目数与您需要拨打的send()(或recv())的来电次数之间存在一对一的关系。这根本不是TCP的工作原理。您可以按照需要的方式格式化数据,然后继续调用send(),直到它告诉您所有数据都已发送。

关于FTP,请阅读RFC 959RFC 3659以了解ftp协议的实际工作原理。在引入MLSTMLSD命令之前,目录列表没有标准格式。 FTP服务器可以自由使用他们想要的任何格式。许多服务器只是从操作系统自己的dirlist命令中提取原始数据。例如,Indy在其FTP客户端中包含数十个解析器,用于处理非标准目录列表。