最近學習C++,linux和網絡編程,想作個小(mini)項目. 就去搜索引擎, 開源中國, Sourceforge上找http server的項目.php
好吧,也去了知乎. 知乎上程序員氛圍好, 有很多經驗能夠借鑑.html
終極目標:本身實現(implement)一個WEB SERVER. linux
感想: 算法和數據結構仍是很重要的...(一切的基礎啊...悔不當初爲何很差好學,去acm也好...)git
指導:Build a simple HTTP server in C (有不會的就問stackoverflow, 因此說若是有一天這網站掛了,網站管理員都不會修了,由於沒有能夠問啊)程序員
資料:github
0.RFC1945:Hypertext Transfer Protocol -- HTTP/1.0 (http協議版本1.0)web
1.RFC2616: rfc2616 Hypertext Transfer Protocol -- HTTP/1.1 (講HTTP協議,版本1.1,114頁大小)算法
2.A Practical Guide to Writing Clients and Servers (15頁打印紙的內容,略長略長,慢慢看)編程
比RFC容易看,快速過一遍.安全
3.RFC2396:
4.RFC2732:
5.RFC822: Standard for ARPA Internet Text Messages
6.RFC1521:MIME part I
前導知識 prerequisites:
0.網絡知識 (看TCP/IP Illustrated)
1.網絡編程 (能夠看UNP, Unix Network Programming)
(或者更好入門的Beej's Guide to Network Programming)
2.系統API (看APUE, Advanced Programming in the UNIX Environment Third Edition)
(書厚不是問題,反正之後都要看,早點看得了)
找到幾個輕量級的小項目:
1.nweb Tiny Webserver (谷歌搜出來的, 200行,靜態網頁,C,安全檢查)
比較簡單,若是有點網絡編程的基礎的話,就是剛學完網絡編程就能寫出來的程度.
用fork(),不用select(). 看完後能夠用select作一次. 代碼中用了signal(),inet_addr()這些不推薦的函數. 能夠本身替代爲sigaction()和inet_aton()
如何寫一個daemon :Linux Daemon Writing HOWTO
我犯過的錯誤:
1. if(a=b)
2.accept()調用時沒有初始化socklen_t addrlen = sizeof client_addr;
3.發送圖片時沒有寫頭部 Content-Type: image/jpg
4. 使用sprintf時沒有使格式和參數一一對應,致使未定義的結果.
5. 調用select()時沒有注意nfds要加1
6.若是要用ipv6,彷佛不能用sa->ai_family = AF_UNSPEC;而只能用AF_INET6;否則問題提示"Connection refused"
7.getaddrinfo()返回0是成功. 非0爲失敗(而仍是-1!!!!!!)
(CSDN上有人解析源碼: 【源碼剖析】tinyhttpd —— C 語言實現最簡單的 HTTP 服務器 )
4.lighthttpd (輕量級,高性能網站,安全、快速、兼容性好而且靈活的web server環境)
(ChinaUNIX 的 lighttpd-1.4.20源碼分析 )
5.Zaver如何寫一個Web服務器 github: (知乎上看到的, 高性能, http/1.1, 基本架構 : 非阻塞, event loop, 線程池)
6.Nginx (生產環境. 不知道爲何我會把這個放在這裏,裝飾下頁面......應該不會去看的)
測試:
1. 壓力測試
http_load
webbench
ab
還有一個問題,閱讀別人的代碼:
1.書:Code Reading
Further Study: