在具體的C++網(wǎng)絡編程中提升你的逼格
John Torjo
Boost.Asio C++ 網(wǎng)絡編程
Copyright ? 2013 Packt Publishing
做為一名權威的C++專家,John Torjo 的編程生涯已經(jīng)超過了15年,在這15年中,除了偶爾用 C#
和 Java
寫程序,他大部分時間都在研究 C++
。
他還很喜歡在 C++ Users Journa l和其他雜志上寫一些編程相關的文章。
閑暇的時候,他喜歡玩撲克、開快車。他有很多自由職業(yè),其中一個就把他玩撲克和編程的愛好結(jié)合在了一起,如果你想聯(lián)系他,可以發(fā)郵件到john.code@torjo.com。
我要感謝我的朋友 Alexandru Chis, Aurelian Hale, Bela Tibor Bartha, Cristian Fatu, Horia Uifaleanu, Nicolae Ghimbovschi 以及 Ovidiu Deac。感謝他們對本書提出的反饋和建議。同時我也要感謝 Packt 公司各位對我頻繁錯過截稿日期行為的包容。然后最需要感謝的是 Chris Kohlhoff,Boost.Asio 的作者,是他寫出了如此偉大的庫。
把這本書獻給我最好的朋友 Darius。
Béla Tibor Bartha
一個使用多種技術和語言進行開發(fā)的專業(yè)軟件工程師。盡管在過去的4年里,他做的是 iOS
和 OSX
應用開發(fā),但是 C++
陪伴他度過了早期個人游戲項目開發(fā)的激情歲月。
我要感謝 John,因為他我才能做這本書的評審
Nicolae Ghimbovschi
一個參加各類 C++
項目超過5年的天才個人開發(fā)者。他主要參與一些企業(yè)通信工程的項目。作為一個狂熱的 Linux
愛好者,他喜歡利用不同的操作系統(tǒng)、腳本工具和編程語言進行測試和實驗。除了編程,他還喜歡騎自行車、瑜伽和冥想。
我要感謝 John 讓我來評審這本書
畫渣程序猿mmoaay,技術很爛,喜歡平面設計、鼠繪、交友、運動和翻譯,但是確作為一只程序猿混跡在IT行業(yè)。熱愛開源,技術爛就只好做做設計和翻譯的工作。
http://avplayer.org 中國第一技術社區(qū)。
前言
第一章:Boost.Asio 入門
什么是 Boost.Asio? 歷史 依賴 編譯 Boost.Asio 重要的宏 同步 VS 異步 異常 VS 錯誤代碼 Boost.Asio 中的多線程 不僅僅是網(wǎng)絡 計時器 io_service 類 總結(jié)
第二章:Boost.Asio 基本原理
網(wǎng)絡 API Boost.Asio 命名空間 IP 地址 端點 Sockets 同步錯誤代碼 Socket 成員函數(shù) 其他注意事項 read/write/connect自由函數(shù) connect 函數(shù) read/write 函數(shù) 異步編程 為什么要異步? 異步 run(),run_one(),poll(),poll_one() 持續(xù)運行 run_one(),poll(),poll_one() 函數(shù) 異步工作 異步 post() VS dispatch() VS wrap() 保持運行 總結(jié)
第三章:回顯服務端/客戶端
TCP 回顯服務端/客戶端 TCP 同步客戶端 TCP 同步服務端 TCP 異步客戶端 TCP 同步服務端 代碼 UDP 回顯服務端/客戶端 UDP 同步回顯客戶端 UDP 同步回顯服務端 總結(jié)
第四章:客戶端和服務端
同步客戶端/服務端 同步客戶端 同步服務端 異步客戶端/服務端 異步客戶端 異步服務端 總結(jié)
第五章:同步VS異步
同步異步混合編程 客戶端和服務端之間消息的互相傳遞 客戶端軟件中的同步 I/O 服務端軟件中的同步 I/O 同步服務端中的線程 客戶端軟件中的異步 I/O 服務端軟件中的異步 I/O 異步服務端中的線程 異步操作 代理實現(xiàn) 總結(jié)
第六章:Boost.Asio-其他特性
std streams 和 std buffer I/O Boost.Asio 和 STL流 streambuf 類 處理 streambuf 對象的自由函數(shù) 協(xié)程 總結(jié)
第七章:Boost.Asio-進階
Asio VS Boost.Asio 調(diào)試 處理程序跟蹤信息 例子 處理程序跟蹤文件 SSL Boost.Asio 的 Windows特性 流處理 隨機存儲處理 對象處理 Boost.Asio 的 POSIX 特性 本地 sockects 連接本地 sockets POSIX 文件描述符 Fork 總結(jié)
索引
網(wǎng)絡編程由來已久,并且是一個極富挑戰(zhàn)性的任務。Boost.Asio 對網(wǎng)絡編程做了一個極好的抽象,從而保證只需要少量的編程就可以實現(xiàn)一個優(yōu)雅的客戶端/服務端軟件。在實現(xiàn)的過程中,它能讓你體會到極大的樂趣。而且更為有益的是:Boost.Asio 包含了一些非網(wǎng)絡的特性,用 Boost.Asio 寫出來的代碼緊湊、易讀,而且如果按照我在書中所講的來做,你的代碼會無懈可擊。
這本書涵蓋了什么?
第一章:Boost.Asio入門將告訴你 Boost.Asio 是什么?怎么編譯它?順帶著會有一些例子。你會發(fā)現(xiàn) Boost.Asio 不僅僅是一個網(wǎng)絡庫。同時你也會接觸到 Boost.Asio 中最核心的類 io_service
。
第二章:Boost.Asio基本原理包含了你必須了解的內(nèi)容:什么時候使用 Boost.Asio?我們將深入了解異步編程——一種比同步更需要技巧,且更有樂趣的編程方式。這一章也是在開發(fā)你自己的網(wǎng)絡應用時可以作為參考的一章。
第三章:回顯服務端/客戶端將會告訴你如何實現(xiàn)一個小的客戶端/服務端應用;也許這會是你寫過的最簡單的客戶端/服務端應用。回顯應用就是把客戶端發(fā)過來的消息發(fā)送回去然后關閉客戶端連接的服務。我們會先實現(xiàn)一個同步的版本,然后再實現(xiàn)一個異步的版本,這樣就可以非常容易地看到它們之間的不同。
第四章:客戶端和服務端會深入討論如何用 Boost.Asio 創(chuàng)建一個簡單的客戶端/服務端應用。我們將討論如何避免諸如內(nèi)存泄漏和死鎖的缺陷。所有的程序都只是實現(xiàn)一個簡單的框架,從而使你能更方便地對它們進行擴展以滿足你的需求。
第五章:同步 VS 異步會帶你了解在同步和異步方式之間做選擇時需要考慮的事情。首要的事情就是不要混淆它們。在這一章,我們會發(fā)現(xiàn)實現(xiàn)、測試和調(diào)試每個類型應用是非常容易的。
第六章:Boost.Asio 的其他特性將帶你了解 Boost.Asio 一些不為人知的特性。你會發(fā)現(xiàn),雖然 std streams 和 streambufs 有一點點難用,但是卻表現(xiàn)出了它們得天獨厚的優(yōu)勢。最后,是姍姍來遲的 Boost.Asio 協(xié)程,它可以讓你用一種更易讀的方式來寫異步代碼。(就好像寫同步代碼一樣)
第七章:Boost.Asio 進階包含了一些 Boost.Asio 進階問題的處理。雖然在日常編程中不需要深入研究它們,但是了解它們對你有益無害(Boost.Asio 高級調(diào)試,SSL,Windows 特性,POSIX 特性等)。
如果要編譯 Boost.Asio 以及運行本書中的例子,你需要一個現(xiàn)代編譯器。例如,Visual Studio 2008 及其以上版本或者 g++ 4.4 及其以上版本
這本書對于那些需要進行網(wǎng)絡編程卻不想深入研究復雜的原始網(wǎng)絡 API 的開發(fā)者來說是一個福音。所有你需要的只是 Boost.Asio 提供的一套 API 。作為著名 Boost C++ 庫的一部分,你只需要額外添加幾個 #include 文件即可轉(zhuǎn)換到 Boost.Asio。
在讀這本書之前,你需要熟悉 Boost 核心庫的一些知識,例如 Boost 智能指針、boost::noncopyable、Boost Functors、Boost Bind、shared_ from_this/enabled_shared_from_this 和 Boost 線程(線程和互斥量)。同時還需要了解 Boost 的 Date/Time。讀者還需要知道阻塞的概念以及“非阻塞”操作。
本書使用不同樣式的文字來區(qū)分不同種類的信息。這里給出這些樣式的例子以及它們的解釋。
文本中的代碼會這樣顯示:“通常一個 io_service
的例子就足夠了”。
代碼是下面這樣的:
read(stream, buffer [, extra options])
async_read(stream, buffer [, extra options], handler)
write(stream, buffer [, extra options])
async_write(stream, buffer [, extra options], handler)
專業(yè)詞匯和重要的單詞用黑體顯示
[!警告或者重要的注釋在這樣的一個框里面]
[?技巧在這樣的一個框里面]
我們歡迎來自讀者的反饋。告訴我們你對這本書的看法——你喜歡哪部分,不喜歡哪部分。讀者的反饋對我們非常重要,它能讓我們寫出對讀者更有幫助的書。
你只需要發(fā)送一封郵件到 feedback@packtpub.com 即可進行反饋,注意在郵件的主題中注明書名。
如果你有一個擅長的專題,想撰寫一本書或者為某本書做貢獻。請閱讀我們在 www.packtpub.com/authors 上的作者指引。
現(xiàn)在你已經(jīng)是 Packt 書籍的擁有者,我們將告訴你一些事項,讓你購買本書得到的收益最大化。
你可以在 http://www.packtpub.com 登錄你的帳號,然后下載你所購買的書籍的全部示例代碼。同時,你也可以通過訪問 http://www.packtpub.com/support 進行注冊,然后這些示例代碼文件將直接發(fā)送到你的郵箱。
盡管我們已經(jīng)盡最大的努力去保證書中內(nèi)容的準確性,但是錯誤還是不可避免的。如果你在我們的書籍中發(fā)現(xiàn)了錯誤——也許是文字,也許是代碼——如果你能將它們報告給我們,我們將不勝感激。這樣的話,你不僅能幫助其他讀者,同時也能幫助我們改進這本書的下一個版本。如果你發(fā)現(xiàn)任何需要糾正的地方,訪問 http://www.packtpub.com/submit-errata,選擇你的書籍,點擊errata submission form鏈接,然后輸入詳細的糾錯信息來將錯誤報告給我們。一經(jīng)確定,你的提交就會通過,然后這個糾錯就會被上傳到我們的網(wǎng)站,或者添加到那本書的糾錯信息區(qū)域的糾錯列表中。所有已發(fā)現(xiàn)的糾錯都可以訪問 http://www.packtpub.com/support,然后通過選擇書名的方式來查看。
如果你有關于本書任何方面的問題,你可以通過 questions@packtpub.com 聯(lián)系我們。我們將盡我們最大的努力進行解答
更多建議: