2011-09-17 29 views
2

我想在C中編寫一個客戶端服務器程序在windows中。目標是從服務器接收目錄列表。現在我試圖用這種方式來開發客戶端服務器來利用大部分資源。寫一個ftp客戶端程序來列出服務器上的文件的最佳方法?

一種實現方式是服務器使單個send()調用發送單個文件的信息。所以如果有100個文件,它會打100個電話。但我覺得它浪費了網絡資源。據我所知,Windows中send()或recv()的緩衝區大小爲8kb。但單個文件的信息幾乎不會是1kb。那麼有沒有辦法讓send()調用發送多個文件info(文件信息存儲在結構中,所以它們基本上形成一個鏈表)?可能是我可以在單個Send()調用中發送至少8個文件的信息。這應該會減少總髮送()的呼叫,以最大13.

所以基本上有一種方法來發送鏈接列表通過發送()?如果你能想出任何其他方法,Plz讓我知道。

回答

1

好問題! +1。

但是,你真的想要還是需要編寫代碼來使用Winsock?這樣做有充分的理由 - 包括這很有趣,也是一個挑戰。但是,如果你不需要,你可能會考慮使用免費的多平臺(當然包括win32)的libcurl ftp library,只是起作用,並且可能使你的工作變得更容易。

+0

謝謝,但我需要使用winsock編寫代碼。它實際上是我正在開發的應用程序的一部分。所以在這個方向上的任何想法都會有所幫助。 – Shanty

+0

爲了再一次擊敗這匹死馬,libcurl確實使用了winsock;但是libcurl處理細節。你可能會認爲它是對winsock的封裝。 –

0

我知道用FTP做這件事的唯一方法是使用多個連接到FTP服務器。如果服務器允許這樣做,則可以提高列表性能,因爲列出完整文件夾樹所需的許多協議交換可以並行運行。

RGDS, 馬丁

0

TCP是一個字節流。無法保證您要發送的項目數量與要撥打send()(或recv())的電話數量之間存在1對1的關係。這不僅僅是TCP的工作原理。您按照需要的方式格式化數據,然後一直呼叫send(),直到它告訴您所有數據已發送。

關於FTP,請閱讀RFC 959RFC 3659,以瞭解ftp協議的實際工作方式。在引入MLSTMLSD命令之前,目錄列表沒有標準格式。 FTP服務器可以自由使用任何他們想要的格式。許多服務器只是通過操作系統自己的dirlist命令傳送原始數據。例如,在其FTP客戶端中包含幾十個解析器,用於處理非標準目錄列表。

相關問題