Iperf 源代碼分析(一)
07-22
轉自:http://blog.csdn.net/willon_tom/article/details/4470186概述前段時間學習Linux網路編程的有關知識,希望看一看這些網路編程的技術在實際的代碼中是如何運用的。正巧實驗室的項目中使用了開源網路性能測試軟體Iperf,於是便初步分析了Iperf的源代碼。現將分析代碼的點滴收穫寫在我的Blog上,希望各位高人多多指教。Iperf 是美國伊利諾斯大學(University of Illinois)開發的一種網路性能測試工具。可以用來測試網路節點間TCP或UDP連接的性能,包括帶寬、延時抖動(jitter,適用於UDP)以 及誤碼率(適用於UDP)等。關於Iperf的下載、安裝以及詳細的使用方法,可以參照:http://dast.nlanr.net/Projects/Iperf/Iperf是按照Server-Client范型工作的。在連接的一端使用以下命令啟動Server:iperf -s在連接的另一端啟動Client:iperf -c 1.1.1.1此 處假設Server端的IP地址為1.1.1.1。經過一段測試時間(默認為10秒),在Server端和Client端就會列印出網路連接的各種性能參 數。Iperf作為一種功能完備的測試工具,還提供了各種選項,例如是建立TCP連接還是UDP連接、測試時間、測試應傳輸的位元組總數、測試模式等。而測 試模式又分為單項測試(Normal Test)、同時雙向測試(Dual Test)和交替雙向測試(Tradeoff Test)。此外,用戶可以指定測試的線程數。這些線程各自獨立的完成測試,並可報告各自的以及匯總的統計數據。對於Iperf的詳細使用方法以及命令行 參數的意義,請參照上面的網頁。Iperf是用C++語言實現的,對設計中的各種結構和功能單元都按照面向對象的思想進行建模。它主要用到了 Unix系統編程中兩個主要的部分:Socket網路編程和多線程編程。因此,通過分析Iperf的源代碼,我們就可以在實際的例子中學習面向對象編程, Socket網路編程以及多線程編程的技術。同時,Iperf實現的功能比較簡單,代碼並不複雜,而且功能比較單一。因此,Iperf是我們研究Unix 系統編程技術的一個很好的學習對象。我所分析的是Iperf 1.7.0版的源代碼。需要說明的是,Iperf的源代碼中既包含了對應於Unix的部分,也包含了對應於Windows的部分。這兩部分是通過條件編譯的預處理語句分別編譯的。我僅對Unix部分的代碼進行分析。Iperf提供的庫在開發Iperf的過程中,開發者把 Socket編程和多線程編程中經常用到的一些系統調用封裝成對象,屏蔽了底層函數的複雜介面,提供了模塊化和面向對象的機制,也為我們提供了一些非常實 用的編程工具,我們可以在實現自己的程序時復用這些類。由於這些類實現的源代碼都比較簡單,也為我們修改前人的代碼實現自己的功能提供了方便。這些類的定義與實現都在源代碼文件夾的lib子文件夾下。主要包括以下一些對象:SocketAddr類:封裝了Socket介面中的網路地址結構(sockaddr_in等)以及各種地址轉換的系統調用(gethostbyname、gethostbyaddr、inet_ntop等);Socket類:封裝了socket文件描述符,以及socket、listen、connect等系統調用;Mutex類以及Condition類:封裝了POSIX標準中的mutex和condition(條件變數)線程同步機制;Thread類:封裝了POSIX標準中的多線程機制,提供了一種簡單易用的線程模型;Timestamp類:通過Unix系統調用gettimeofday實現了一個時間戳對象,提供了獲得當前時間戳,計算兩個時間戳之間的先後關係等方法。此外,在lib文件夾中還包括一些Iperf的實現提供的實用工具函數,包括endian.c文件中的位元組序轉 換函數、gnu_getopt文件中的命令行參數處理函數、snprintf文件中的字元串格式化函數、signal.c文件中的與信號處理有關的函數、 string.c文件中的字元處理函數、tcp_window_size.c文件中的TCP窗口大小處理函數等。接下來對lib文件夾中的一些比較重要的類和函數進行說明。
推薦閱讀:
推薦閱讀: