2

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

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

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

4

3 回答 3

1

好问题!为此+1。

但是您真的想要或需要编写代码来使用 Winsock 吗?这样做有充分的理由——包括它的乐趣和挑战。但是,如果您不需要,您可能需要考虑使用libcurl ftp 库,它是免费的、多平台的(当然包括 win32),可以正常工作,并且可能会使您的工作更轻松。

于 2011-09-17T09:35:20.270 回答
0

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

Rgds,马丁

于 2011-09-17T10:37:59.943 回答
0

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

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

于 2011-09-17T16:50:10.680 回答