Linux C++項目推薦:文件服務(wù)器+如何快速上手C++大項目
1 本次分享的意義
源碼地址:https://github.com/shangguanyongshi/WebFileServer.git
視頻講解:Linux C++項目推薦:WebFileServer文件服務(wù)器+如何快速上手C++大項目
學(xué)完C++和Linux編程后, 可以以WebFileServer文件服務(wù)器作為練手項目,比WebServer項目多了文件上傳的功能,更加有意義。
這次分享不單只是講解這個WebFileServer項目如何運行,也能讓大家掌握如何快速掌握自己不熟悉的C++項目。
2 項目功能
Web 文件服務(wù)器,通過瀏覽器發(fā)送 HTTP 請求管理服務(wù)器指定文件夾下的所有文件。主要功能包括:
- 以 HTML 頁面形式返回該文件夾下的所有文件
- 可以選擇本地文件上傳到服務(wù)器
- 可以對列表中的文件文件執(zhí)行下載操作
- 可以刪除服務(wù)器中的指定文件
3 整體框架
- 使用 Reactor 事件處理模型,通過統(tǒng)一事件源,主線程使用 epoll 監(jiān)聽所有的事件,工作線程負(fù)責(zé)執(zhí)行事件的邏輯處理
- 預(yù)先創(chuàng)建線程池,當(dāng)有事件發(fā)生時,加入線程池的工作隊列中,使用隨機選擇算法選擇線程池中的一個線程處理工作隊列的事件
- 使用 HTTP GET 方法獲取文件列表,發(fā)起下載文件、刪除文件的請求。使用 POST 方法向服務(wù)器上傳文件
- 服務(wù)端使用有限狀態(tài)機對請求消息進(jìn)行解析,根據(jù)解析結(jié)果執(zhí)行操作后,向客戶端發(fā)送頁面、發(fā)送文件或發(fā)送重定向報文
- 服務(wù)端使用 sendfile 函數(shù)實現(xiàn)零拷貝數(shù)據(jù)發(fā)送
4 編譯和運行
- build 項目
sh ./build.sh
默認(rèn)的編譯不支持調(diào)試,可以修改makefile增加-g編譯選項。
然后再重新編譯,以方便調(diào)試代碼。
- 啟動文件服務(wù)器
./main
- 在瀏覽器端輸入 服務(wù)端ip:端口號(端口號默認(rèn)是8888)
serverip:8888
5 如何快速分析代碼
5.1 main函數(shù)入口
(gdb) b main Breakpoint 1 at 0x5555555590ad: file main.cpp, line 3.
5.2 分析網(wǎng)絡(luò)模型
通過info threads可以看到 共有五個線程,其中主線程是調(diào)用了epoll,再加上README的講解可以推斷出來這個項目是單個epoll +線程池的模式
* 1 Thread 0x7ffff79a9740 (LWP 339328) "main" 0x00007ffff7c1c68e in epoll_wait (epfd=4, events=0x7fffffffaf14, maxevents=1024, timeout=-1) at ../sysdeps/unix/sysv/linux/epoll_wait.c:30 2 Thread 0x7ffff79a8700 (LWP 339343) "main" futex_abstimed_wait_cancelable ( ) at ../sysdeps/nptl/futex-internal.h:320 3 Thread 0x7ffff71a7700 (LWP 339344) "main" futex_abstimed_wait_cancelable ( ) at ../sysdeps/nptl/futex-internal.h:320 4 Thread 0x7ffff69a6700 (LWP 339345) "main" futex_abstimed_wait_cancelable ( ) at ../sysdeps/nptl/futex-internal.h:320 5 Thread 0x7ffff61a5700 (LWP 339346) "main" futex_abstimed_wait_cancelable ( ) at ../sysdeps/nptl/futex-internal.h:320
5.3 網(wǎng)絡(luò)數(shù)據(jù)收發(fā)
5.3.1 數(shù)據(jù)接收
斷點 recv
Thread 4 "main" hit Breakpoint 4, __libc_recv (fd=5, buf=0x7ffff69a5600, len=2048, flags=0) at ../sysdeps/unix/sysv/linux/recv.c:24 24 ../sysdeps/unix/sysv/linux/recv.c: No such file or directory. (gdb) bt #0 __libc_recv (fd=5, buf=0x7ffff69a5600, len=2048, flags=0) at ../sysdeps/unix/sysv/linux/recv.c:24 #1 0x000055555555df4a in HandleRecv::process (this=0x55555558bb90) at event/myevent.cpp:38 #2 0x000055555555c114 in ThreadPool::run (this=0x55555558b2b0) at threadpool/threadpool.cpp:114 #3 0x000055555555bc5c in ThreadPool::worker (arg=0x55555558b2b0) at threadpool/threadpool.cpp:77 #4 0x00007ffff7f8a609 in start_thread (arg=<optimized out>) at pthread_create.c:477 #5 0x00007ffff7c1c353 in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95
很明顯,這個項目是在線程池的線程里讀取socket 數(shù)據(jù)并解析解析處理。
5.3.2 數(shù)據(jù)發(fā)送
斷點 send
說明數(shù)據(jù)的響應(yīng)也是在線程池的線程進(jìn)行的。
6 拓展建議
建議將本項目的功能一直到muduo庫進(jìn)一步測試,對比分析性能的差異。
也建議和nginx做更多測試對比。
這樣可以不斷優(yōu)化項目的性能,面試的時候也能有更多可以講解的內(nèi)容。
#我的失利項目復(fù)盤##校招過來人的經(jīng)驗分享##校招##簡歷中的項目經(jīng)歷要怎么寫##c++#