C++新經典:Linux C++通信架構實戰( 簡體 字) | |
作者:王健偉 | 類別:1. -> 程式設計 -> C++ -> C++ 2. -> 作業系統 -> Linux |
出版社:清華大學出版社 | 3dWoo書號: 53702 詢問書籍請說出此書號! 有庫存 NT售價: 495 元 |
出版日:11/1/2020 | |
頁數:393 | |
光碟數:0 | |
站長推薦: | |
印刷:黑白印刷 | 語系: ( 簡體 字 ) |
ISBN:9787302555292 | 加入購物車 │加到我的最愛 (請先登入會員) |
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證, 繁體書的下載亦請直接連絡出版社) | |
第1章課程介紹
1.1本書內容詳細介紹 1.1.1內容總述 1.1.2為什么選擇Linux操作系統平臺 1.1.3講解規劃和學習建議 1.1.4書籍推薦和讀書須知 1.2環境搭建詳細介紹 1.2.1Windows下的VisualStudio2019安裝 1.2.2準備一個Word文檔 1.2.3Windows下的虛擬機安裝 1.2.4在虛擬機中安裝Linux操作系統 1.2.5配置固定IP地址 1.2.6配置遠程連接 1.2.7安裝編譯工具gcc、g++等 1.2.8共享一個操作目錄 第2章進入Nginx之門 2.1Nginx簡介、選擇理由、安裝和使用 2.1.1Nginx簡介 2.1.2為什么選擇Nginx 2.1.3安裝Nginx,搭建Web服務器 2.1.4Nginx的啟動和簡單使用 2.2Nginx整體結構、進程模型 2.2.1Nginx的整體結構 2.2.2Nginx進程模型細說 第3章Nginx開發初步 3.1學習Nginx源碼前的準備工作 3.1.1Nginx源碼總述 3.1.2Nginx源碼查看工具 3.1.3Nginx源碼入口函數定位 3.1.4創建一個自己的Linux下的C語言程序 3.2Nginx源碼學法,終端和進程的關系 3.2.1Nginx源碼學習方法 3.2.2終端和進程的關系 3.3信號的概念、認識、處理動作 3.3.1信號的基本概念 3.3.2通過kill命令認識一些信號 3.3.3進程的狀態 3.3.4常用信號列舉 3.3.5信號處理的相關動作 3.4UNIX/Linux體系結構、信號編程初步 3.4.1UNIX/Linux操作系統體系結構 3.4.2signal函數范例 3.5信號編程進階、sigprocmask范例 3.5.1信號集(信號屏蔽字) 3.5.2信號相關函數 3.5.3sigprocmask等信號函數范例演示 3.6fork函數詳解、范例演示 3.6.1簡單認識fork函數 3.6.2進一步認識fork函數 3.6.3完善fork代碼 3.6.4一個和fork執行有關的邏輯判斷 3.6.5fork失敗的可能原因 3.7守護進程詳解、范例演示 3.7.1普通進程運行觀察 3.7.2守護進程基本概念 3.7.3守護進程編寫規則 3.7.4守護進程不會收到的信號 3.7.5守護進程和后臺進程的區別 第4章服務器程序框架初步 4.1服務器程序目錄規劃、makefile編寫 4.1.1信號高級認識范例 4.1.2服務器架構初步 4.2讀配置文件、查泄漏、設置標題實戰 4.2.1基礎設施之配置文件讀取 4.2.2內存泄漏的檢查工具 4.2.3設置進程名稱(標題) 4.3日志打印實戰,優化main函數調用順序 4.3.1基礎設施之日志打印實戰代碼一 4.3.2設置時區 4.3.3基礎設施之日志打印實戰代碼二 4.3.4理順main函數中代碼執行順序 4.4信號、子進程實戰,文件I/O詳談 4.4.1信號功能實戰 4.4.2Nginx中創建worker子進程 4.4.3日志輸出重要信息講解 4.4.4write函數思考 4.4.5掉電導致write寫入的數據丟失破解法 4.4.6標準I/O庫 4.5守護進程及信號處理實戰 4.5.1守護進程功能的實現 4.5.2信號處理函數的進一步完善(避免僵尸子進程) 第5章網絡通信實戰 5.1C/S、TCP/IP妙趣橫生、惟妙惟肖談 5.1.1客戶端與服務器端 5.1.2網絡模型 5.1.3最簡單的客戶端和服務器程序實現代碼 5.1.4TCP和UDP的區別 5.2TCP三次握手詳析,telnet、Wireshark示范 5.2.1TCP連接的三次握手 5.2.2telnet工具使用介紹 5.2.3Wireshark監視數據包 5.2.4TCP斷開的四次揮手 5.3TCP狀態轉換,TIME_WAIT詳解,SO_REUSEADDR 5.3.1TCP狀態轉換 5.3.2TIME_WAIT狀態 5.3.3SO_REUSEADDR選項 5.4listen隊列剖析、阻塞與非阻塞、同步與異步 5.4.1listen隊列剖析 5.4.2阻塞與非阻塞I/O 5.4.3異步與同步I/O 5.5監聽端口實戰、epoll介紹及原理詳析 5.5.1監聽端口 5.5.2epoll技術簡介 5.5.3epoll原理與函數介紹 5.6通信代碼精粹之epoll函數實戰1 5.6.1提醒注意 5.6.2配置文件的修改 5.6.3epoll函數實戰 5.7通信代碼精粹之epoll函數實戰2 5.7.1ngx_epoll_process_events函數調用位置 5.7.2ngx_epoll_process_events函數內容 5.7.3ngx_event_accept函數內容 5.7.4總結和測試 5.7.5事件驅動總結 5.7.6一道騰訊后臺開發的面試題 5.8ET、LT深釋,服務器設計、粘包解決 5.8.1ET、LT模式深入分析及測試 5.8.2本項目的服務器設計 5.9通信代碼精粹之收包、解包實戰 5.9.1收包分析及包頭結構定義 5.9.2收包狀態宏定義 5.9.3收包實戰代碼 5.9.4測試服務器收包避免推諉扯皮 第6章服務器業務邏輯處理框架 6.1業務邏輯之多線程、線程池實戰 6.1.1學習方法 6.1.2多線程的提出 6.1.3線程池實戰代碼 6.1.4線程池的使用 6.2業務邏輯之打通業務處理脈搏實戰 6.2.1線程池代碼調整及補充說明 6.2.2線程池實現具體業務之準備代碼 6.2.3threadRecvProcFunc成員函數講解 6.2.4整體測試工作的開展 6.3預發包,多線程資源回收深度思考 6.3.1業務邏輯細節寫法說明 6.3.2連接池中連接回收的深度思考 6.3.3程序(進程)退出時線程的安全終止 6.3.4epoll事件處理的改造 6.3.5連接延遲回收的具體應用 6.4LT發數據機制深釋、gdb調試淺談 6.4.1水平觸發模式(LT)下發送數據深度解釋 6.4.2gdb調試淺談 6.5發數據、信號量、并發、多線程綜合實戰 6.5.1發送數據指導思想 6.5.2發送數據代碼實戰 6.5.3發送數據后續處理代碼 第7章畫龍點睛之服務器安全與完善 7.1過往總結、心跳包代碼實戰 7.1.1前面學習的總結 7.1.2心跳包概念 7.1.3心跳包代碼實戰 7.2控制連入數,黑客攻擊防范及畸形包應對 7.2.1控制并發連入數量 7.2.2黑客攻擊的防范 7.2.3超時直接踢出服務器的需求 7.3超負荷安全處理、綜合壓力測試 7.3.1輸出一些觀察信息 7.3.2遺漏的安全問題思考 7.3.3壓力測試前的準備工作 7.3.4壓力測試 7.4驚群、性能優化大局觀 7.4.1CPU占比與驚群 7.4.2性能優化大局觀 7.4.3性能優化的實施 7.4.4配置最大允許打開的文件句柄數 7.4.5內存池補充說明 第8章總結與展望 8.1遺留問題探討增補之消息跳躍發送 8.1.1調整ngx_write_request_handler函數的代碼順序 8.1.2消息的跳躍發送 8.2結束語、課程總結 8.2.1本書概要總結 8.2.2技術總結 8.2.3項目的用途總結 8.2.4學習方法總結 8.2.5架構師之路 8.2.6代碼統計與再見 這是一本Linux下C++通信架構實戰書籍,針對于C/C++語言已經掌握的很熟并希望進一步深造以將來用C++在Linux下從事網絡通信領域/網絡服務器的開發和架構工作。包括如下內容:(1)項目本身是一個極完整的多線程高并發的服務器程序;(2)按照包頭包體格式正確的接收客戶端發送過來的數據包, 完美解決收包時的數據粘包問題;(3)根據收到的包的不同來執行不同的業務處理邏輯;(4)把業務處理產生的結果數據包正確返回給客戶端。
自序 親愛的讀者,如果你已經讀完了筆者的《C++新經典》《C++新經典: 對象模型》兩本介紹C++語言基礎的書籍,并決定進一步深入學習,以備將來用C++在Linux下從事網絡通信/網絡服務器開發和架構工作,那么這本《C++新經典: Linux C++通信架構實戰》,是筆者推薦給你的第3本書,不可錯過。 書籍介紹 本書要求讀者 對C語言的掌握沒有障礙; 對C++語言中的對象、類等概念的簡單應用沒有障礙(不要求對C++掌握得非常深,筆者也將展示用不多的C++開發知識就能寫出極其強悍的商業代碼); 不要求讀者熟悉網絡或者Linux操作系統。 本書展示了一個完整的項目,其中包括通信框架和業務邏輯框架。 相信讀者一旦掌握了這個通信框架和業務邏輯框架,定會如虎添翼。采用此項目的框架作為公司的基礎框架,只需在框架中融入業務邏輯代碼即可,這為公司節省的資金和時間可能是巨量的。 書中的項目適用于客戶端和服務器之間保持TCP長連接,并且兩端之間不算太頻繁地進行一些數據收發的場景,如網絡游戲服務器等。 書中的項目不適用于客戶端和服務器之間有大量數據需要持續收發的場景,如傳遞視頻、傳遞大文件等。但是,一旦全面掌握了本項目并對其進行有針對性的改造,也是完全能夠將其應用于其他場合的。 很多網絡通信課程的老師或者相關書籍的作者喜歡什么都講,不但自己疲憊不堪,也讓學習的人暈頭轉向,學了這個忘了那個,分散精力,事倍功半,這絕對是知識傳授者的失職。在筆者看來,知識傳授者的一個最大職責,就是幫助讀者鑒別哪些知識是最有用、最需要學的,哪些知識是價值不高的、可以暫時不學的。本書將講解的重點定位在多線程高并發這個最常使用的、難度最大的服務器通信開發領域,不多講,不少講,正好夠用。 有些讀者一提到網絡通信架構/網絡服務器,就會想到各種現成的網絡服務器框架(庫,如ACE、Boost Asio、Libevent等),并且把大部分時間都花費在了熟悉和應用這些框架上。在筆者看來,不如用這些時間來研究一下這些網絡服務器框架的底層實現手段和所涉及的技術,知其然并知其所以然,雖然我們不見得需要自己造輪子,但如果知道輪子是怎么造的就等于抓住了事物的本質和規律,就能夠在關鍵時刻大顯身手,并且使自己的技術素養和實力提升一大步。 在世界范圍內,C++網絡通信編程方面的圖書并不多。究其原因,主要是編寫這類書對作者的要求非常高。一般來講,低于15年一線開發經驗的作者,寫出一本比較完善的C++網絡編程書是相當勉強的。即便是達到15年一線開發經驗,如果沒有從零開始搭建一個完整的網絡通信框架的親身經歷,去寫這樣一本實戰書也很容易出現漏洞。 目前市面上名氣最大的網絡通信編程書當屬《UNIX網絡編程卷1套接字聯網API》。這是一本非常棒的書,知識覆蓋面廣,講解問題非常細致,體現了作者深厚的知識積累和廣博的認知。但這本書也有它的局限性,例如書中講解的多數都是知識點以及代碼片段,并沒有把這些代碼片段串起來轉化成一個商業項目或者商業框架,以使其能夠直接用于項目中(能夠用于項目中的代碼才有最直接的價值)。 對于筆者而言,寫這本書的壓力巨大: 內容本身難度很高是其一; 要把這種難度的內容描述清楚讓人看得懂則也是一個巨大的挑戰(相信讀者在現實生活中遇到過不少自己明白卻把別人講糊涂的人)。這本書的編寫,充滿艱辛,從敲定內容至整理成書耗時8個月,而筆者在從事開發行業近15年后才著手從零開始逐步搭建并完善書中的項目,又在實際的工作中不斷檢驗和完善了近10年,最終才形成讀者今天看到的這本書。可以說,這本書所講授的項目,體現著筆者20多年一線開發實戰經驗積累的巔峰開發實力。 縱觀以往,很少有人敢于嘗試教只掌握C和基本C++語言的開發者去學習這種難度頗高的網絡通信架構知識,但筆者愿意做這個擺渡人,通過這本書,用自己多年積累的知識,為讀者鋪設一條極速的成才之路,可以毫不夸張地說,學好這本書,讀者可以節省少則3~5年,多則10年的在C++網絡通信開發道路上成長和摸索的時間。 在整本書的教授中,筆者提供了非常完善的代碼,給出翔實的代碼注釋,并始終帶領讀者認真解讀每一行代碼的含義。這些是日后真正在工作中拿過來就能用的商業品質的代碼。選擇這本書,你就等于找到了一個20多年經驗的人來幫助自己寫代碼,詳細地告訴你每行代碼的含義,這在以往是難以想象的事情。選擇這本書,你就能夠和筆者一起,編寫一套極高質量的服務器通信代碼并對其輕松駕馭,在前進的道路上,你一定會比別人快得多! 本書共8章36節。 第1章,課程介紹。談一談本書的內容、講解的規劃以及學習的建議。詳細闡述開發環境的搭建、必要信息的配置、必要工具的安裝等問題。 第2章,進入Nginx之門。對Nginx進行簡介,闡述選擇Nginx作為講解起點的理由,詳細介紹Nginx的目錄組織結構,介紹如何編譯、安裝和執行Nginx,講述Nginx的進程模型以及一些值得關注和學習的Nginx特性。 第3章,Nginx開發初步。對Nginx源碼進行全局性的介紹,教讀者創建一個自己的Linux下的C語言程序。以“終端和進程關系詳解”作為切入點,引入bash以及終端的概念,介紹strace工具的使用,對信號、fork創建子進程、守護進程等概念都進行了非常詳細的講解,為后續的學習打下堅實的基礎。 第4章,服務器程序框架初步。詳細闡述本書所搭建的服務器程序的各種規劃(包括目錄規劃、編譯工具的選擇)并詳解部分實戰代碼。這些實戰代碼,是作為一個服務器框架必備的基礎設施,包括讀配置文件、設置標題、日志的各種分級輸出。同時把信號處理、創建子進程、創建守護進程等以往講解過的知識全部融入服務器框架中來。 第5章,網絡通信實戰。詳細闡述TCP/IP中最重要的概念(包括三次握手、四次揮手、TCP狀態轉換細節、listen隊列),講解基本的客戶端/服務器通信程序的組成部分,引入網絡輔助工具telnet、Wireshark并演示它們的使用。闡述阻塞和非阻塞、同步I/O和異步I/O的概念。對epoll網絡模型的實現原理進行極其詳細的介紹并編寫相關的實戰代碼。此外,還詳細講解并解決服務器收包時的TCP粘包問題。 第6章,服務器業務邏輯處理框架。詳細講解為處理業務邏輯所引入的線程池概念和代碼,深入探討多線程資源的回收、連接池中連接的回收、線程的安全終止等高級話題。引入筆者獨創的連接延遲回收機制確保服務器工作的穩定性,對于epoll中水平觸發模式下數據的發送進行極深入的講解和代碼實戰,同時,對如何使用gdb調試一個崩潰的程序并找到程序中的bug進行了細致的演示。 第7章,畫龍點睛之服務器安全與完善。完整實現了心跳包代碼實戰。為了服務器的安全,在控制連入數量、防范黑客攻擊、應對畸形數據包方面,筆者都下了巨大的工夫。此外,為了確保服務器超負荷運轉時能夠及時被發現,筆者在項目中的很多關鍵位置設置了負荷檢查,在出現需要警惕的狀況時(例如收到太多數據包來不及處理、積壓太多數據包發送不出去時)可及時進行日志輸出。可以說,各種可能的安全問題都被筆者縝密地想到和解決了。此外,筆者還編寫了一個比較完整的客戶端測試程序,用于測試整個服務器框架程序。在本章的最后,探討了驚群問題以及如何實現服務器程序的性能提升這個關鍵話題。 第8章,總結與展望。依據筆者20多年的開發經驗,為讀者提供一些筆者自己的所思所想,期望對讀者有所幫助! 本書閱讀進度 不排除有基礎好和學習速度特別快的讀者可以很快讀完本書并掌握得很好,但通常來講,筆者建議如下的閱讀進度。 整本書一共8章36節,筆者建議大概每周學習1節或者3周學習2節。整本書后半部分內容(第5章起)比前半部分內容學習難度更大、篇幅更大,所以,后半部分內容每節的學習花的時間可能更多,但是平均下來,筆者認為每節學習10天還是能夠做到的,這意味著整本書大概需要350天(1年)的學習時間。 筆者必須提醒讀者,在學習本書的過程中: 本節的內容沒學明白,絕不可以往下學。網絡通信類知識,有其固有的難度,筆者有多年的經驗積累并竭盡全力去講述,但讀者千萬不可以理所當然地認為知識本身很簡單。如果有某一節沒學明白,后續學習就會越來越困難,甚至不得不放棄學習,這種情況筆者絕不希望在任何讀者身上出現。基礎差的讀者,哪怕一節課看3遍甚至10遍,哪怕學習時間再加長1倍、2倍甚至更多倍,也絕不可以在沒弄懂的情況下學習下一節! 在閱讀過程中,讀者絕不可以只用眼睛看或者只用耳朵聽,一定要動起手來,對書中每個地方的內容、代碼,都要親自實踐來驗證,并且都要保證驗證成功。學習中遇到任何困難,都可以及時找作者或者其他讀者溝通。切記,動手實踐的步驟,是加深對知識理解和掌握的步驟,一旦缺少這個步驟,你的記憶就不深,掌握的知識就不牢。 運行環境 本書的范例全部在Linux操作系統下用g++編譯器編譯通過并能正確運行。 部分測試程序在Windows操作系統下的Visual Studio 2019中創建,所以,Visual Studio 2019也是需要安裝的。 筆者搭建的演示環境采用的是VMware Workstation虛擬機并在其中安裝烏班圖(Ubuntu)64位Linux操作系統,連接Linux的終端用的是Xshell,代碼的編輯環境采用Visual Studio Code。 對于上述環境不熟悉的讀者,建議筆者用什么你們就用什么,一絲一毫都不差,以免節外生枝,導致搭建環境若干天也搞不定,影響學習進度。在配套的學習資料中,筆者會提供相應的軟件,可能軟件版本有點老,但是絲毫不影響學習,讀者沒有必要去追求最新版本,除非安裝這些最新版本出了問題你自己能夠搞定。 對于搭建環境熟悉的,出了問題自己能解決的讀者,是否用虛擬機、是否用烏班圖Linux、用哪個終端以及什么編輯軟件等問題,自己怎么習慣就怎么來,沒有條條框框的限制。 資料獲取 本書有完整的配套學習資料(源碼),讀者可以免費獲取。獲取方法如下。 (1) 請查找并關注“程序員速成”微信公眾號。 (2) 在微信公眾號中輸入“通信架構”4個字,就可以獲取配套學習資料下載鏈接。 讀者評論 筆者在出版本書之前,有數月的時間,通過網絡推出本書所講述的內容,收到了大量學習者的反饋和很多極高的評價,99%的評論都是五星好評。這里摘錄一部分評論留言: 狂想老師的課真的太精彩了,服務器端開發小白看了之后簡直打通了任督二脈!夸! 狂夸!希望大家都來買狂想老師的課! 最近搞個AI的特性,用上了你講的架構和epoll的接口設計,主管直接加薪5000元,加薪后超越30k元的月薪了。 老師講得特別棒,全是干貨。 課程講得非常好,受益匪淺,謝謝老師。 我把老師的C++課程和對象模型都學習完了,前面兩門課程講得不錯,思路清晰,特別是講C++11一些新知識點,不是把知識點硬塞給你,而是為了解決某些問題引入。這門課程我也是第一時間入手,相信老師的能力。非常好的課程! 從老師的《C++從入門到精通 C++11/14/17》跟過來的,說良心話,老師講得真不錯,邏輯清晰,詳略得當。五星好評! 講得很細致,一些基礎概念都有提及,照顧到我們這些新手,讓我們能學到平常難以接觸的知識,很好。 我是跟著老師的對象模型過來的,不得不說,真是非常好的課程。 C++工作14年的老菜鳥來學藝,希望能得到質的飛躍!技術這東西不服牛人不行,有些地方自學不只是多走彎路的事兒,是根本入不了道。 這個課程真的非常棒,之前沒什么項目經驗,所以沒信心,學完這個課之后感覺自己提升很多,學到了很多知識,自信心增加,對我找工作幫助很大,感謝老師! 老師講得真心好,不知不覺幫我解決了很多工作中遇到的沒有理解透的難點,非常實用。如果不聽老師的課,這些僅靠自己真是太難了,感謝老師讓從事8年C語言工作的我重拾信心。 正好新公司要我接手服務器框架。2倍速聽完了老師的課程,對我理解公司的代碼有很大的幫助。為來年月薪30k元努力!!! 筆者寄語 實戰能力是長期培養起來的,沒有什么捷徑。最有效的方法就是看高手如何解決問題,看高手怎么思考,怎么深入問題。但平時工作中幾乎沒有高手會有時間教你這些。 這本書之所以非常珍貴,就是因為這里面蘊含著我對解決問題及實戰的各種思考。但我發現很多同學對這門課程的認識不足,學習力度不夠,導致學習效果不佳。 這不是看電影,你們買張票,我在臺上演,你們在臺下看。不是這樣,是你們要到臺上來,跟我一起演,而且你們的戲份比我還要重。 這本書可以讓絕大多數還在上學的人只學習1~2年的時間,畢業之后就可以吊打畢業5~10年的各路開發高手,前提是,你肯下工夫學,并且還得能學通、學透。 另外,這本書不是為了拼湊各種知識,不是為了貪大求全,什么都講,本書會集中火力,講解一些筆者認為最有用的東西,當讀者自己有了比較好的基礎后,就能夠快速地去領悟去學習新的東西了。 致謝 20年前,筆者寫過一本《Crystal Reports水晶報表設計與開發實務》,這本書的編寫實在是太辛苦,有3個多月,每天大概要寫到后半夜3點才能休息。書完成之后,整個人瘦了好幾圈。 雖然書有一定的銷量,但是跟付出比感覺不成比例。所以,從那時候開始,筆者就暗下決心,從此以后再也不寫書了。 人算不如天算,2018年下旬,筆者通過網絡,逐步發布一些C/C++類網絡課程。意外的是,這些課程獲得了極好的口碑,隱隱有超越世面絕大多數C/C++類課程的趨勢。在這個時候,清華大學出版社電子信息教材事業部主任、首席策劃盛東亮先生找到筆者,希望筆者能夠寫一本優質的C/C++類書籍。 因為多年前出書的辛勞產生的心理陰影,筆者當時本能地拒絕了寫書這件事,但在筆者的心里卻從此埋下了寫書的種子。 幾個月之后,筆者終于想通了寫書這件事,覺得有兩點好處: ①幫助更多的讀者掌握更多的C++開發知識,這是為筆者自己增加福報,也是為這個社會盡一點自己的微薄之力,做一個對社會有用的人; ②擴大一下自身的知名度,增加收入,畢竟筆者也需要掙更多的錢養家,通過自己的勞動賺取收入,這是光榮的。 當筆者把出書的想法說給盛東亮先生時,他非常高興并與筆者做了深入的溝通。我們二人年紀相仿,聊得很投機,在寫書這件事情上觀點也非常一致——希望這是一本高質量的、經典的C++書籍,是一本可以擺在書架上10年甚至20年的書籍,如果僅讓讀者選那么二三本最好的C++書時,希望這是其中一本。我相信,讀者從書名中也能感受到筆者對這本書的用心。 在出書的交流過程中,盛先生給予了筆者相當多的支持與鼓勵。可以說,如果沒有盛先生當初的接洽和后續順暢愉快的交流,如果不是許多實際的工作都能在最短的時間敲定并逐一落實,這本書也許根本不會出現在讀者面前。所以,這份感謝,筆者要送給盛東亮先生。 最后 C++知識體系龐雜,而Linux C++通信架構方面的知識又具有相當的深度和難度。雖然筆者盡心盡力,但因水平所限,書中存在疏漏之處在所難免,懇請廣大讀者發現問題后不吝指教。 編者2020年7月 |