2013-06-01 150 views
3

嘗試使用Linux套接字接口在C中實現一個簡單的HTTP服務器我遇到了一些我希望具有的特性,即持久連接的困難。使用單獨的TCP連接一次發送一個文件相對容易,但似乎並不是非常有效的解決方案(例如考慮多個握手)。無論如何,服務器應該在一個TCP連接期間處理多個請求(HTML,CSS,圖像)。你能否給我一些線索如何解決這個問題?HTTP持久連接

+2

您是否考慮過使用或至少學習一些HTTP服務器免費庫的源代碼,例如C D.Moreno的[libonion](http://www.coralbits.com/libonion/)?實現一個完整的HTTP服務器堆棧是很多工作。 –

回答

10

這很簡單 - 只需在編寫回復後關閉TCP連接即可。

有兩種方法可以做到這一點,流水線式和非流水線式。

在非流水線實現中,您在套接字上讀取一個http請求,對其進行處理,將其寫回套接字,然後嘗試讀取另一個http請求。繼續這樣做直到遠程方關閉套接字,或者在大約10秒後停止在套接字上獲取請求後自行關閉它。

在流水線實現中,讀取與套接字上的請求數量相同的請求,並行處理它們,然後將它們全部寫回到套接字上,順序與接收到的順序相同。您一直有一個線程讀取請求,另一個線程再次寫入請求。

你不必這樣做,但你可以做廣告,你支持持續連接和流水線,通過增加您的答覆如下標題:

Connection: Keep-Alive 

閱讀: http://en.wikipedia.org/wiki/HTTP_persistent_connection

順便說一句,在實踐中,持久連接並沒有很大的優勢。管理握手的開銷與讀取和寫入數據到網絡套接字所花費的時間相比非常小。關於持續連接的性能優勢存在一些爭議。一方面,在負載很重的情況下,保持連接打開意味着您的系統在TIME_WAIT中插座的數量會減少很多。另一方面,因爲您將套接字保持打開狀態持續10秒,在任何給定時間都會打開更多的套接字,這與您在非持久性模式下打開的套接字數量相比會更多。

如果您有興趣提高自寫服務器的性能 - 您可以採取的最佳措施來提高服務器網絡「前端」的性能,即實現基於事件的套接字管理系統。看看libev和eventlib。

+0

使用持續連接(基於我從書中讀取的內容)的另一個巨大優勢是跳過「慢啓動」階段,更多地使用帶寬。 – 8090PZ