2009-12-23 50 views
1

我正在玩一些C代碼,寫一個小型的網絡服務器。我所做的目的是使用不同的網絡技術編寫服務器,以便我可以更多地瞭解它們(多線程vs多進程vs選擇vs輪詢)。大部分代碼保持不變,但我希望網絡代碼能夠被「換出」,以針對不同的技術進行一些性能測試。我想過使用ifdefs,但看起來它很快會讓代碼變得醜陋。有什麼建議麼?處理多個C「項目」中的類似代碼

回答

3

動態庫加載?例如在Linux中是dlopen

只需構建一個需要動態加載的組件通用的API。

+0

沒有評論的另一個「驅車倒票」......多麼幼稚。 – jldupont

1

用靈活的接口將網絡部分編譯到它自己的庫中。根據需要將該lib編譯到各種包裝中。您甚至可以找到符合您要求的預先存在的庫。

2

我更喜歡從C/C++源碼推送「條件編譯」到makefile,即具有從多個.c/.cpp文件生成的相同符號,但僅鏈接由構建選項選擇的對象中的鏈接。

如果你還沒有看過nginx,可能會給你一些關於web服務器實現的想法。

1

把網絡相關功能的不同實現放到不同的.c文件中,共享一個共同的頭文件,而不是鏈接到你想要使用的文件。從這裏開始,您可以使用這種方法爲您的makefile創建x個不同的可執行文件,因此您可以只說「make httpd_select」或「make httpd_poll」等。

尤其適用於基準測試以查找最好的方法可能會讓你在編譯器/鏈接器級別做更可靠的結果,而不是通過共享庫或函數指針,因爲這可能在運行時帶來額外的開銷。