2012-03-19 114 views
0

我正在處理客戶端服務器應用程序。我的應用程序正在處理可變大小的數據包,每個數據包都有一個頭部和一個可變長度的有效載荷Recv環形緩衝區vs簡單緩衝區

我的困境是什麼是在recv時處理數據包的最佳方法。 我遇到的大多數教程都建議使用環形緩衝區,但據我所知,使用緩衝區的效率更高,因爲緩衝區的大小是您可以處理的最大數據包大小的兩倍。

如果我使用環形緩衝器我需要的recv附加的緩衝,然後我需要緩衝器複製在環形緩衝器,這意味着我需要做一個或兩個memcpys插入緩衝器在環形緩衝器

如果我使用單緩衝區方法,則只需要一個緩衝區,我可以將它傳遞給recv調用,當memoove調用將數據移動到緩衝區的起始處時,當我得到一個完整的數據包時,仍然有數據屬於另一個數據包緩衝。

我錯了嗎?

PS。如果您可以指向任何源代碼/示例,其中處理可變長度數據包將有所幫助。

+0

這是TCP還是UDP? – 2012-03-19 17:42:20

+0

@KarolyHorvath它的TCP – 2012-03-19 17:47:16

+1

爲什麼投票? – 2012-03-19 18:35:49

回答

1

如果我使用環形緩衝器我需要的recv附加的緩衝,然後我需要緩衝器複製在環形緩衝器,這意味着我需要做一個或兩個memcpys插入緩衝器在環形緩衝器

是的,兩個讀寫,沒什麼大不了的(*)。但是你不需要額外的緩衝區。爲了讀取,只需將讀取最大化到剩餘的空間直到環形緩衝區結束。

(*):如果您擔心額外系統調用的成本,分散/集中讀/寫有recvmsgsendmsg

+0

是的,我可以調用recv與len =環形緩衝區的可用空間,但這意味着我會失去一些吞吐量,因爲我可以結束調用recv的長度參數爲 – 2012-03-19 18:25:23

+0

的非常小的值參見(*)。這可能沒有關係。這些優化只在極高性能的服務器中很重要。 – 2012-03-19 19:20:25

+0

你是對的。但我仍然不明白在簡單緩衝區上使用環形緩衝區有什麼優點 – 2012-03-19 19:36:08