打算學慣用C語言進行linux網路編程,求推薦學習路徑?

新手:小白到連C語言都不會,linux開發沒見過,網路不懂
求推薦一個學習路徑,告訴我幾本參考書,分別在討論什麼知識,學習需要花多少時間(非脫產)

個人分析
需要讀懂C語言
需要能夠在linux生存
需要能夠在linux開發
需要懂網路
需要能抓蟲子

求大神們推薦書目砸死我吧

-----------------------
目前回答的匯總

C語言基礎
《C程序設計語言》
C primer
Beej"s Guide to Network Programming
Beej"s Guide to C Programming

計算機與網路基礎
《深入理解計算機系統》,《深入理解Linux內核》
《計算機網路》,《TCP/IP詳解》

linux生存
《鳥哥私房菜-基礎篇》

LINUX開發
《UNIX環境高級編程》
《UNIX網路編程》

網路協議定義
相關所有技術的RFC文檔,比如RFC 2616(HTTP),RFC 959(FTP),等等

工具類
gcc
makefile
gdb

基礎知識部分
計算機組成(15小時初學,預計需60小時掌握)
操作系統原理(15小時初學,預計需60小時掌握)
網路原理(未知)


《UNIX環境高級編程》
《UNIX網路編程》
《TCP/IP詳解》
相關所有技術的RFC文檔,比如RFC 2616(HTTP),RFC 959(FTP),等等


先把謝希仁的 《計算機網路》 看完 如果都看不完 你還是別搞網路了 也別搞網路編程了 更別說LINUX了


這年頭大家都流行先抗住後優化= =
也是推薦樓主先基本架子了解,再每個部分細學

c語言入門感覺隨便看啥都行(高中時候看的譚浩強,後來看到數組不會了就沒看了,其實也沒對我造成啥傷害= =)
大家普遍會推薦兩本
the c programming language,比較薄,容易看
c primer plus,太厚了= =我後來當工具書最後送給別人了

這時候就可以順便裝個發行版熟悉環境啦,搜下主流發行版看看哪個順眼就先折騰起來吧
完事以後選個自己喜歡的編輯器或者ide什麼的,準備日久生情(或者生厭= =

然後linux 環境編程,當年看的這本advanced linux programming,看的翻譯版,從如何在Linux下怎麼入手編譯程序,寫程序balabala,著實為迷茫的我入了個好門
最後網路編程,當年入門看的這本,the definitive guide to linux network programming,跟上面一樣,也是著實入了個好門= =
中間有不懂的網路方面的東西,就去搜索吧,不推薦書看了

入門性的東西好多不是看書看來的,都是這搜點兒那搜點兒就差不多辣

說起我當年,一開始就是unix環境高級編程、tcp/ip詳解,還特裝逼的買英文版來看,結果完全gg啊,辣么厚啊,當時的我看起來感覺像是工具書啊= =沒看幾頁,畢業時候本來擺攤賣的,被老師遇到送老師了哎一西
現在有了點點基礎和實際經驗,回頭再來看就能學到很多東西啦
前面小夥伴推薦的書都很好,很多都在今年重擼計劃里= =

順便題主這個問題,我初看時候是蠻奇怪= =
因為就我當年來說,也是在先學了c以後,想了蠻久和搜了蠻多,才了解到linux網路編程這個方向
所以很好奇題主怎麼想到這個方向的啊啊啊啊,看了下,樓主應該也是有其他語言基礎的?窩還去問了個黑闊小夥伴認不認識你= =(八卦之火熊熊燃起

然後我咋這麼羅嗦啊啊啊啊啊


推薦兩個在線教程:
Beej"s Guide to Network Programming
Beej"s Guide to C Programming


假設你有基本C語言基礎
Linux伺服器端編程~~游雙寫的,比較簡單,適合入門

先寫點小的伺服器客戶端通信的程序,順帶也熟悉了linux的環境,對於新手來說,Shell和gcc編譯其實都可能遇到很多問題,先熟悉基本的東西


進階就是上面同學說的
Richard Steven 的五本書
以APUE為首,網路編程以及進程通信為輔
還有網路協議的兩本

看完就看Epoll,高性能網路伺服器的相關設計模式,內核協議棧實現等等等


不建議對於一個智商一般毅力一般的同學上來就看APUE這種級別的書,這樣只能打擊學習的積極性


在以上網友提供的再加幾本:
《C程序設計語言》
《深入理解計算機系統》
《深入理解Linux內核》
《UNIX環境高級編程》
《UNIX網路編程》
《TCP/IP詳解》


上面大家推薦的書你都先不要去看,你現在去看,只會讓你下定決心不幹這一行。其實最好的方法是邊做邊學,先從最簡單的程序編起,看到自己的程序成功運行的那一刻,你會很有成就感的,有了成就感就會更有興趣驅動你進一步的學習。在做的過程中發現自己在哪些方面有知識欠缺,有針對性的去學,這樣的學習才是最有效率的。程序猿界最有名的一句話是talk is cheap,show me the code。歡迎加入程序猿的世界,在這裡你將找到無限的樂趣


對於初學者而言,入門需要的不是書籍,而是無論如何也想要學習的念頭,有了這個念頭,即使你拿到的是一本譚浩強,也不妨礙你在這條路上走的更遠。

乾貨的話:

裝好一個linux,練習使用gcc+makefile編譯代碼,從hello world開始寫起,最後能夠實現一個Client/Server的簡單交互,你就已經上路了。期間遇到的種種問題,搜索引擎會告訴你答案。


先別忙著去啃《UNIX環境高級編程》這類的經典書籍。先學會如何寫C語言,並熟悉Linux環境的基本操作吧。Linux入門的話,推薦《鳥哥私房菜-基礎篇》,C語言的話,可以先看看《C primer》,都是基礎知識,熟悉基本語法,把上面的代碼都在Linux環境下親自敲敲。熟悉得差不多了,就可以看看《C語言程序設計》和《UNIX環境高級編程》了。不懂的隨時使用搜索引擎。這兩本書啃到一定的時候,基本上也知道自己需要學習些什麼東西,自己能夠找到方向去學習了。當然,這個學習過程不是一天兩天的事,重在堅持,每天學習一兩個小時,堅持幾個月收穫就不小了。


Unix/Linux編程實踐教程 這本吧。


學習Linux是一個比較漫長的過程, 更是需要長時間的經驗累積,聽上去好像是廢話,但又是真話。下面來點實際的吧。
既然是想學 Linux Networking programming, 從小白開始,我覺得很好的學習步驟可以這麼來:
1. C 編程,找一本書,好好琢磨,一本就好哦,定要學通。
2. BJ『s network. 初步了解Socket 編程。
3. 有了初步基礎,可以寫寫,TCP 和 UDP 的相關程序 - 了解為啥udp 是 packet base, tcp 是 stream base.
4. 還可以看看Poco network 開源代碼。及其易懂,看看他們是怎麼包裝socket.

學完以上的東西,對整個socket 應用層應該就有一定了解了。 但是,要寫出高效,high performance network code, 必須要懂整個network stack是怎麼工作的。

比如說,你的程序掉包了,它掉在哪裡了?什麼原因會造成掉包?
比如說,你的程序,為啥只能收5000 packet / sec. 咋樣才能做到 1 million packet / sec?

要徹底搞清楚這些問題,肯定會涉及到NIC - KERNEL - APPLICATION的work flow. 這個時候,就可以稍微涉及點簡單到中等難度的network kernel學習。可以看看network driver internal 這本書的相關章節。

要做一個network killer application, 最後肯定會涉及到kernel by passing. 如果有了基本的內核知識,看起來還是比較融會貫通的。


C/C++後台工程師書單


先從 嗨翻C語言開始 相當適合你的目標,早買早開始干。


推薦閱讀:

不考慮非同步io的epoll方式的非阻塞伺服器端為了接收文件,臨時把socket設為阻塞,做法正確嗎?

TAG:伺服器 | C編程語言 | Linux開發 | 網路編程 |