2012-11-04 20 views
0

我正在寫一個FUSE overlay fs(notifyfs),它可以是一個數據庫客戶端可以通過查詢從 中獲取數據。我的意圖是使它成爲一個緩存/ overlayfs /數據庫客戶端可以從顯示條目及其屬性(屬性,但也mimetype,圖標等)時獲取數據。如何通過套接字發送數據:一個緩衝區,scatter/gatter或readdir是什麼樣的?

查詢是獲取目錄的內容。已經與notifyfs連接(= fd)的客戶端通過「list_message」請求數據。我的問題是現在如何編程notifyfs必須提供的響應。我正在考慮三種/兩種不同的方法。請注意以下幾點:

notifyfs與不同的條目,每個條目排序的基本形式回覆:

int mode 
uid_t uid 
gid_t gid 
size_t size 
timespec ctime 
timespec mtime 
timespec atime 
int lenname 
char name[] 

(稱之爲notifyfs_entry_struct)

注意名稱的len不固定,並且最大爲255. 進一步的客戶請求一定數量的條目,最大值。我完全不確定這個最大值,但它會像80.

a。一個大緩衝區。的大小是這樣的:

80×(255 +的sizeof(結構notifyfs_entry_struct))

這將超過20400個字節,以確定。

b。固定大小的塊,使用像iovec或readdir這樣的東西。

什麼是最佳選擇? 第一種方法使用的緩衝區至少有20400字節,這是很多,但它仍然可行嗎?

Stef

回答

0

既然你提到「連接」,我假設你正在談論TCP套接字。

你選擇哪種方法並不重要。 a.有點簡單 - 連續的內存,簡單的偏移到緩衝區。

你必須注意的是,TCP套接字是字節流。它不知道你的消息邊界,所以既然你的消息是可變大小的,你不知道你是否從返回值read(2)recv(2)得到了一個完整的消息。您將必須處理部分消息讀取和緩衝未處理的字節。

+0

非常感謝。不,我使用本地套接字。客戶端是本地應用程序,它們希望從某個特定名稱(目錄或普通文件)和最大數量的條目中獲取目錄的內容。所以這是一個數據庫FS。你說什麼方法並不重要。但在第一種情況下(一個大緩衝區)的大小將非常大(25 K)。那還好嗎? – user1388973

+0

是的,它仍然可以。 –

相關問題