[{"data":1,"prerenderedAt":5005},["ShallowReactive",2],{"wiki-page-\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0400-tcp-tong-xin":3,"wiki-doc-items-\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0400-tcp-tong-xin":4585,"language-switcher-data-\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0400-tcp-tong-xin":4989,"wiki-i18n-paths-\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0400-tcp-tong-xin":5004},{"id":4,"title":5,"body":6,"canonicalPath":4567,"chapterDepth":111,"chapterOrder":4568,"date":4569,"description":30,"docI18nKey":4570,"docKey":4571,"docRoot":4572,"docTitle":4573,"extension":4574,"i18nKey":4575,"isBlogPost":4576,"isWikiDoc":146,"isWikiIndex":4576,"layout":4577,"legacyPath":4577,"locale":4578,"localeSlug":4579,"meta":4580,"navigation":146,"path":4567,"seo":4581,"sourcePath":4582,"sourceStem":4575,"stem":4583,"wikiDepth":100,"__hash__":4584},"content\u002F_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0400-TCP通信.md","TCP 通信",{"type":7,"value":8,"toc":4526},"minimark",[9,20,23,34,45,48,56,60,63,86,89,743,750,753,756,791,798,823,826,829,835,838,852,855,861,864,870,873,876,896,899,902,909,912,918,921,927,933,939,942,945,948,950,957,960,967,970,1505,1509,1512,1515,1523,1526,1554,1557,1560,1566,1569,1575,1578,1581,1587,1594,1608,1611,1617,1619,1623,1626,1629,1649,1652,3009,3013,3016,3019,3047,3050,3063,3066,3072,3075,3078,3084,3087,3093,3100,3106,3109,3115,3121,3126,3129,3132,3151,3158,3164,3167,3173,3176,3201,3210,3216,3231,3234,3237,3271,3274,3276,3280,3283,3286,3299,3302,4275,4279,4282,4285,4293,4295,4323,4326,4328,4334,4337,4343,4346,4356,4363,4413,4422,4424,4428,4431,4437,4440,4446,4449,4455,4458,4464,4467,4484,4486,4489,4522],[10,11,12],"blockquote",{},[13,14,15,16,19],"p",{},"TCP 是面向連接、可靠、有序的字節流協議。",[17,18],"br",{},"\n在機器人裏，TCP 常用於：上位機調試工具、遠程控制、日誌上傳、參數服務、局域網設備通信等。",[13,21,22],{},"注意：TCP 是“字節流”，不是“消息包”。所以以後必須面對：",[24,25,31],"pre",{"className":26,"code":28,"language":29,"meta":30},[27],"language-text","粘包、半包、协议分帧\n","text","",[32,33,28],"code",{"__ignoreMap":30},[13,35,36,37,40,41,44],{},"本節依舊先寫普通 ",[32,38,39],{},"main()","，再寫類封裝版本。異步回調統一用 ",[32,42,43],{},"std::bind","。",[46,47],"hr",{},[49,50,52,53,55],"h2",{"id":51},"示例-1普通-main-裏寫同步-tcp-echo-server","示例 1：普通 ",[32,54,39],{}," 裏寫同步 TCP Echo Server",[57,58,59],"h3",{"id":59},"程序目標",[13,61,62],{},"寫一個最小 TCP 服務端：",[64,65,66,74,77,80,83],"ol",{},[67,68,69,70,73],"li",{},"監聽 ",[32,71,72],{},"0.0.0.0:9000","；",[67,75,76],{},"等待一個客戶端連接；",[67,78,79],{},"讀取客戶端發來的一段數據；",[67,81,82],{},"原樣發回去；",[67,84,85],{},"程序結束。",[57,87,88],{"id":88},"完整代碼",[24,90,94],{"className":91,"code":92,"language":93,"meta":30,"style":30},"language-cpp shiki shiki-themes github-light github-dark","#include \u003Cboost\u002Fasio.hpp>\n#include \u003Cboost\u002Fsystem\u002Ferror_code.hpp>\n#include \u003Carray>\n#include \u003Ciostream>\n#include \u003Cstring>\n\nusing boost::asio::ip::tcp;\n\nint main()\n{\n    \u002F\u002F 程序从 main 函数开始执行，下面的语句会按顺序运行。\n    \u002F\u002F io_context 是 Asio 的事件循环对象，异步任务需要靠它调度。\n    boost::asio::io_context io;\n    boost::system::error_code ec;\n\n    \u002F\u002F acceptor 负责监听 TCP 端口并接收客户端连接。\n    tcp::acceptor acceptor(io, tcp::endpoint(tcp::v4(), 9000));\n\n    std::cout \u003C\u003C \"server：监听 0.0.0.0:9000，等待客户端连接\" \u003C\u003C std::endl;\n\n    tcp::socket socket(io);\n    \u002F\u002F 同步 accept 会阻塞，直到有客户端连接进来。\n    acceptor.accept(socket, ec);\n    if (ec)\n    {\n        std::cout \u003C\u003C \"server：accept 失败：\" \u003C\u003C ec.message() \u003C\u003C std::endl;\n        return 1;\n    }\n\n    std::cout \u003C\u003C \"server：客户端已连接\" \u003C\u003C std::endl;\n\n    std::array\u003Cchar, 1024> data;\n    std::size_t n = socket.read_some(boost::asio::buffer(data), ec);\n    if (ec)\n    {\n        std::cout \u003C\u003C \"server：读取失败：\" \u003C\u003C ec.message() \u003C\u003C std::endl;\n        return 1;\n    }\n\n    std::string msg(data.data(), n);\n    std::cout \u003C\u003C \"server：收到 \" \u003C\u003C n \u003C\u003C \" 字节：\" \u003C\u003C msg;\n\n    boost::asio::write(socket, boost::asio::buffer(data, n), ec);\n    if (ec)\n    {\n        std::cout \u003C\u003C \"server：回写失败：\" \u003C\u003C ec.message() \u003C\u003C std::endl;\n        return 1;\n    }\n\n    std::cout \u003C\u003C \"server：已原样回写，程序结束\" \u003C\u003C std::endl;\n\n    return 0;\n}\n","cpp",[32,95,96,109,117,125,133,141,148,173,178,190,196,203,209,222,235,240,246,289,294,318,323,337,343,355,364,370,400,412,418,423,441,446,469,508,515,520,546,555,560,565,585,611,616,646,653,658,684,693,698,703,721,726,737],{"__ignoreMap":30},[97,98,101,105],"span",{"class":99,"line":100},"line",1,[97,102,104],{"class":103},"szBVR","#include",[97,106,108],{"class":107},"sZZnC"," \u003Cboost\u002Fasio.hpp>\n",[97,110,112,114],{"class":99,"line":111},2,[97,113,104],{"class":103},[97,115,116],{"class":107}," \u003Cboost\u002Fsystem\u002Ferror_code.hpp>\n",[97,118,120,122],{"class":99,"line":119},3,[97,121,104],{"class":103},[97,123,124],{"class":107}," \u003Carray>\n",[97,126,128,130],{"class":99,"line":127},4,[97,129,104],{"class":103},[97,131,132],{"class":107}," \u003Ciostream>\n",[97,134,136,138],{"class":99,"line":135},5,[97,137,104],{"class":103},[97,139,140],{"class":107}," \u003Cstring>\n",[97,142,144],{"class":99,"line":143},6,[97,145,147],{"emptyLinePlaceholder":146},true,"\n",[97,149,151,154,158,162,165,167,170],{"class":99,"line":150},7,[97,152,153],{"class":103},"using",[97,155,157],{"class":156},"sScJk"," boost",[97,159,161],{"class":160},"sVt8B","::",[97,163,164],{"class":156},"asio",[97,166,161],{"class":160},[97,168,169],{"class":156},"ip",[97,171,172],{"class":160},"::tcp;\n",[97,174,176],{"class":99,"line":175},8,[97,177,147],{"emptyLinePlaceholder":146},[97,179,181,184,187],{"class":99,"line":180},9,[97,182,183],{"class":103},"int",[97,185,186],{"class":156}," main",[97,188,189],{"class":160},"()\n",[97,191,193],{"class":99,"line":192},10,[97,194,195],{"class":160},"{\n",[97,197,199],{"class":99,"line":198},11,[97,200,202],{"class":201},"sJ8bj","    \u002F\u002F 程序从 main 函数开始执行，下面的语句会按顺序运行。\n",[97,204,206],{"class":99,"line":205},12,[97,207,208],{"class":201},"    \u002F\u002F io_context 是 Asio 的事件循环对象，异步任务需要靠它调度。\n",[97,210,212,215,217,219],{"class":99,"line":211},13,[97,213,214],{"class":156},"    boost",[97,216,161],{"class":160},[97,218,164],{"class":156},[97,220,221],{"class":160},"::io_context io;\n",[97,223,225,227,229,232],{"class":99,"line":224},14,[97,226,214],{"class":156},[97,228,161],{"class":160},[97,230,231],{"class":156},"system",[97,233,234],{"class":160},"::error_code ec;\n",[97,236,238],{"class":99,"line":237},15,[97,239,147],{"emptyLinePlaceholder":146},[97,241,243],{"class":99,"line":242},16,[97,244,245],{"class":201},"    \u002F\u002F acceptor 负责监听 TCP 端口并接收客户端连接。\n",[97,247,249,252,255,258,261,264,266,269,272,274,276,279,282,286],{"class":99,"line":248},17,[97,250,251],{"class":156},"    tcp",[97,253,254],{"class":160},"::acceptor ",[97,256,257],{"class":156},"acceptor",[97,259,260],{"class":160},"(io, ",[97,262,263],{"class":156},"tcp",[97,265,161],{"class":160},[97,267,268],{"class":156},"endpoint",[97,270,271],{"class":160},"(",[97,273,263],{"class":156},[97,275,161],{"class":160},[97,277,278],{"class":156},"v4",[97,280,281],{"class":160},"(), ",[97,283,285],{"class":284},"sj4cs","9000",[97,287,288],{"class":160},"));\n",[97,290,292],{"class":99,"line":291},18,[97,293,147],{"emptyLinePlaceholder":146},[97,295,297,300,303,306,309,312,315],{"class":99,"line":296},19,[97,298,299],{"class":156},"    std",[97,301,302],{"class":160},"::cout ",[97,304,305],{"class":103},"\u003C\u003C",[97,307,308],{"class":107}," \"server：监听 0.0.0.0:9000，等待客户端连接\"",[97,310,311],{"class":103}," \u003C\u003C",[97,313,314],{"class":156}," std",[97,316,317],{"class":160},"::endl;\n",[97,319,321],{"class":99,"line":320},20,[97,322,147],{"emptyLinePlaceholder":146},[97,324,326,328,331,334],{"class":99,"line":325},21,[97,327,251],{"class":156},[97,329,330],{"class":160},"::socket ",[97,332,333],{"class":156},"socket",[97,335,336],{"class":160},"(io);\n",[97,338,340],{"class":99,"line":339},22,[97,341,342],{"class":201},"    \u002F\u002F 同步 accept 会阻塞，直到有客户端连接进来。\n",[97,344,346,349,352],{"class":99,"line":345},23,[97,347,348],{"class":160},"    acceptor.",[97,350,351],{"class":156},"accept",[97,353,354],{"class":160},"(socket, ec);\n",[97,356,358,361],{"class":99,"line":357},24,[97,359,360],{"class":103},"    if",[97,362,363],{"class":160}," (ec)\n",[97,365,367],{"class":99,"line":366},25,[97,368,369],{"class":160},"    {\n",[97,371,373,376,378,380,383,385,388,391,394,396,398],{"class":99,"line":372},26,[97,374,375],{"class":156},"        std",[97,377,302],{"class":160},[97,379,305],{"class":103},[97,381,382],{"class":107}," \"server：accept 失败：\"",[97,384,311],{"class":103},[97,386,387],{"class":160}," ec.",[97,389,390],{"class":156},"message",[97,392,393],{"class":160},"() ",[97,395,305],{"class":103},[97,397,314],{"class":156},[97,399,317],{"class":160},[97,401,403,406,409],{"class":99,"line":402},27,[97,404,405],{"class":103},"        return",[97,407,408],{"class":284}," 1",[97,410,411],{"class":160},";\n",[97,413,415],{"class":99,"line":414},28,[97,416,417],{"class":160},"    }\n",[97,419,421],{"class":99,"line":420},29,[97,422,147],{"emptyLinePlaceholder":146},[97,424,426,428,430,432,435,437,439],{"class":99,"line":425},30,[97,427,299],{"class":156},[97,429,302],{"class":160},[97,431,305],{"class":103},[97,433,434],{"class":107}," \"server：客户端已连接\"",[97,436,311],{"class":103},[97,438,314],{"class":156},[97,440,317],{"class":160},[97,442,444],{"class":99,"line":443},31,[97,445,147],{"emptyLinePlaceholder":146},[97,447,449,451,454,457,460,463,466],{"class":99,"line":448},32,[97,450,299],{"class":156},[97,452,453],{"class":160},"::array",[97,455,456],{"class":103},"\u003Cchar",[97,458,459],{"class":160},", ",[97,461,462],{"class":284},"1024",[97,464,465],{"class":103},">",[97,467,468],{"class":160}," data;\n",[97,470,472,474,476,479,482,485,488,491,493,496,498,500,502,505],{"class":99,"line":471},33,[97,473,299],{"class":156},[97,475,161],{"class":160},[97,477,478],{"class":103},"size_t",[97,480,481],{"class":160}," n ",[97,483,484],{"class":103},"=",[97,486,487],{"class":160}," socket.",[97,489,490],{"class":156},"read_some",[97,492,271],{"class":160},[97,494,495],{"class":156},"boost",[97,497,161],{"class":160},[97,499,164],{"class":156},[97,501,161],{"class":160},[97,503,504],{"class":156},"buffer",[97,506,507],{"class":160},"(data), ec);\n",[97,509,511,513],{"class":99,"line":510},34,[97,512,360],{"class":103},[97,514,363],{"class":160},[97,516,518],{"class":99,"line":517},35,[97,519,369],{"class":160},[97,521,523,525,527,529,532,534,536,538,540,542,544],{"class":99,"line":522},36,[97,524,375],{"class":156},[97,526,302],{"class":160},[97,528,305],{"class":103},[97,530,531],{"class":107}," \"server：读取失败：\"",[97,533,311],{"class":103},[97,535,387],{"class":160},[97,537,390],{"class":156},[97,539,393],{"class":160},[97,541,305],{"class":103},[97,543,314],{"class":156},[97,545,317],{"class":160},[97,547,549,551,553],{"class":99,"line":548},37,[97,550,405],{"class":103},[97,552,408],{"class":284},[97,554,411],{"class":160},[97,556,558],{"class":99,"line":557},38,[97,559,417],{"class":160},[97,561,563],{"class":99,"line":562},39,[97,564,147],{"emptyLinePlaceholder":146},[97,566,568,570,573,576,579,582],{"class":99,"line":567},40,[97,569,299],{"class":156},[97,571,572],{"class":160},"::string ",[97,574,575],{"class":156},"msg",[97,577,578],{"class":160},"(data.",[97,580,581],{"class":156},"data",[97,583,584],{"class":160},"(), n);\n",[97,586,588,590,592,594,597,599,601,603,606,608],{"class":99,"line":587},41,[97,589,299],{"class":156},[97,591,302],{"class":160},[97,593,305],{"class":103},[97,595,596],{"class":107}," \"server：收到 \"",[97,598,311],{"class":103},[97,600,481],{"class":160},[97,602,305],{"class":103},[97,604,605],{"class":107}," \" 字节：\"",[97,607,311],{"class":103},[97,609,610],{"class":160}," msg;\n",[97,612,614],{"class":99,"line":613},42,[97,615,147],{"emptyLinePlaceholder":146},[97,617,619,621,623,625,627,630,633,635,637,639,641,643],{"class":99,"line":618},43,[97,620,214],{"class":156},[97,622,161],{"class":160},[97,624,164],{"class":156},[97,626,161],{"class":160},[97,628,629],{"class":156},"write",[97,631,632],{"class":160},"(socket, ",[97,634,495],{"class":156},[97,636,161],{"class":160},[97,638,164],{"class":156},[97,640,161],{"class":160},[97,642,504],{"class":156},[97,644,645],{"class":160},"(data, n), ec);\n",[97,647,649,651],{"class":99,"line":648},44,[97,650,360],{"class":103},[97,652,363],{"class":160},[97,654,656],{"class":99,"line":655},45,[97,657,369],{"class":160},[97,659,661,663,665,667,670,672,674,676,678,680,682],{"class":99,"line":660},46,[97,662,375],{"class":156},[97,664,302],{"class":160},[97,666,305],{"class":103},[97,668,669],{"class":107}," \"server：回写失败：\"",[97,671,311],{"class":103},[97,673,387],{"class":160},[97,675,390],{"class":156},[97,677,393],{"class":160},[97,679,305],{"class":103},[97,681,314],{"class":156},[97,683,317],{"class":160},[97,685,687,689,691],{"class":99,"line":686},47,[97,688,405],{"class":103},[97,690,408],{"class":284},[97,692,411],{"class":160},[97,694,696],{"class":99,"line":695},48,[97,697,417],{"class":160},[97,699,701],{"class":99,"line":700},49,[97,702,147],{"emptyLinePlaceholder":146},[97,704,706,708,710,712,715,717,719],{"class":99,"line":705},50,[97,707,299],{"class":156},[97,709,302],{"class":160},[97,711,305],{"class":103},[97,713,714],{"class":107}," \"server：已原样回写，程序结束\"",[97,716,311],{"class":103},[97,718,314],{"class":156},[97,720,317],{"class":160},[97,722,724],{"class":99,"line":723},51,[97,725,147],{"emptyLinePlaceholder":146},[97,727,729,732,735],{"class":99,"line":728},52,[97,730,731],{"class":103},"    return",[97,733,734],{"class":284}," 0",[97,736,411],{"class":160},[97,738,740],{"class":99,"line":739},53,[97,741,742],{"class":160},"}\n",[13,744,745,749],{},[746,747,748],"strong",{},"運行結果","：見下方“運行輸出與時間順序”；如果示例涉及定時器、線程、網絡或外部設備，具體時間和順序可能會隨環境略有變化。",[57,751,752],{"id":752},"編譯運行",[13,754,755],{},"終端 1：運行服務端。",[24,757,761],{"className":758,"code":759,"language":760,"meta":30,"style":30},"language-bash shiki shiki-themes github-light github-dark","g++ demo1_tcp_sync_server.cpp -o demo1_tcp_sync_server -std=c++17 -lboost_system -pthread\n.\u002Fdemo1_tcp_sync_server\n","bash",[32,762,763,786],{"__ignoreMap":30},[97,764,765,768,771,774,777,780,783],{"class":99,"line":100},[97,766,767],{"class":156},"g++",[97,769,770],{"class":107}," demo1_tcp_sync_server.cpp",[97,772,773],{"class":284}," -o",[97,775,776],{"class":107}," demo1_tcp_sync_server",[97,778,779],{"class":284}," -std=c++17",[97,781,782],{"class":284}," -lboost_system",[97,784,785],{"class":284}," -pthread\n",[97,787,788],{"class":99,"line":111},[97,789,790],{"class":156},".\u002Fdemo1_tcp_sync_server\n",[13,792,793,794,797],{},"終端 2：用 ",[32,795,796],{},"nc"," 連接服務端。",[24,799,801],{"className":758,"code":800,"language":760,"meta":30,"style":30},"echo \"hello tcp\" | nc 127.0.0.1 9000\n",[32,802,803],{"__ignoreMap":30},[97,804,805,808,811,814,817,820],{"class":99,"line":100},[97,806,807],{"class":284},"echo",[97,809,810],{"class":107}," \"hello tcp\"",[97,812,813],{"class":103}," |",[97,815,816],{"class":156}," nc",[97,818,819],{"class":284}," 127.0.0.1",[97,821,822],{"class":284}," 9000\n",[57,824,825],{"id":825},"運行輸出與時間順序",[13,827,828],{},"服務端啓動後立刻輸出：",[24,830,833],{"className":831,"code":832,"language":29,"meta":30},[27],"server：监听 0.0.0.0:9000，等待客户端连接\n",[32,834,832],{"__ignoreMap":30},[13,836,837],{},"此時服務端阻塞在：",[24,839,841],{"className":91,"code":840,"language":93,"meta":30,"style":30},"acceptor.accept(socket, ec);\n",[32,842,843],{"__ignoreMap":30},[97,844,845,848,850],{"class":99,"line":100},[97,846,847],{"class":160},"acceptor.",[97,849,351],{"class":156},[97,851,354],{"class":160},[13,853,854],{},"客戶端連接併發送數據後，服務端輸出：",[24,856,859],{"className":857,"code":858,"language":29,"meta":30},[27],"server：客户端已连接\nserver：收到 10 字节：hello tcp\nserver：已原样回写，程序结束\n",[32,860,858],{"__ignoreMap":30},[13,862,863],{},"客戶端終端會收到回顯：",[24,865,868],{"className":866,"code":867,"language":29,"meta":30},[27],"hello tcp\n",[32,869,867],{"__ignoreMap":30},[57,871,872],{"id":872},"本示例需要注意的點",[13,874,875],{},"同步 TCP 服務端會阻塞：",[64,877,878,884,890],{},[67,879,880,883],{},[32,881,882],{},"accept()"," 阻塞等待連接；",[67,885,886,889],{},[32,887,888],{},"read_some()"," 阻塞等待數據；",[67,891,892,895],{},[32,893,894],{},"write()"," 阻塞等待寫完成。",[13,897,898],{},"這適合理解流程，但不適合複雜機器人程序主線程。",[57,900,901],{"id":901},"關鍵函數說明",[903,904,906],"h4",{"id":905},"tcpacceptor-acceptorio-tcpendpointtcpv4-9000",[32,907,908],{},"tcp::acceptor acceptor(io, tcp::endpoint(tcp::v4(), 9000));",[13,910,911],{},"作用：創建 TCP 監聽器，監聽本機所有 IPv4 地址的 9000 端口。",[903,913,915],{"id":914},"acceptoracceptsocket-ec",[32,916,917],{},"acceptor.accept(socket, ec);",[13,919,920],{},"作用：同步等待客戶端連接。",[13,922,923,924,44],{},"返回值：",[32,925,926],{},"void",[13,928,929,930,932],{},"連接成功後，",[32,931,333],{}," 表示和這個客戶端的連接。",[903,934,936],{"id":935},"socketread_somebuffer-ec",[32,937,938],{},"socket.read_some(buffer, ec);",[13,940,941],{},"作用：同步讀取當前能讀到的一些字節。",[13,943,944],{},"返回值：讀取到的字節數。",[13,946,947],{},"注意：它不保證一次讀到完整一條消息。",[46,949],{},[49,951,953,954,956],{"id":952},"示例-2普通-main-裏寫同步-tcp-client","示例 2：普通 ",[32,955,39],{}," 裏寫同步 TCP Client",[57,958,59],{"id":959},"程序目標-1",[13,961,962,963,966],{},"寫一個 TCP 客戶端，連接 ",[32,964,965],{},"127.0.0.1:9000","，發送一行數據，再讀取服務端回顯。",[57,968,88],{"id":969},"完整代碼-1",[24,971,973],{"className":91,"code":972,"language":93,"meta":30,"style":30},"#include \u003Cboost\u002Fasio.hpp>\n#include \u003Cboost\u002Fsystem\u002Ferror_code.hpp>\n#include \u003Carray>\n#include \u003Ciostream>\n#include \u003Cstring>\n\nusing boost::asio::ip::tcp;\n\nint main()\n{\n    \u002F\u002F 程序从 main 函数开始执行，下面的语句会按顺序运行。\n    \u002F\u002F io_context 是 Asio 的事件循环对象，异步任务需要靠它调度。\n    boost::asio::io_context io;\n    boost::system::error_code ec;\n\n    tcp::socket socket(io);\n    tcp::endpoint server_endpoint(boost::asio::ip::make_address(\"127.0.0.1\"), 9000);\n\n    std::cout \u003C\u003C \"client：准备连接 127.0.0.1:9000\" \u003C\u003C std::endl;\n\n    \u002F\u002F 发起连接，成功后 socket 才能收发数据。\n    socket.connect(server_endpoint, ec);\n    if (ec)\n    {\n        std::cout \u003C\u003C \"client：连接失败：\" \u003C\u003C ec.message() \u003C\u003C std::endl;\n        return 1;\n    }\n\n    std::cout \u003C\u003C \"client：连接成功\" \u003C\u003C std::endl;\n\n    std::string msg = \"hello tcp\\n\";\n    boost::asio::write(socket, boost::asio::buffer(msg), ec);\n    if (ec)\n    {\n        std::cout \u003C\u003C \"client：发送失败：\" \u003C\u003C ec.message() \u003C\u003C std::endl;\n        return 1;\n    }\n\n    std::cout \u003C\u003C \"client：发送完成，等待回显\" \u003C\u003C std::endl;\n\n    std::array\u003Cchar, 1024> data;\n    \u002F\u002F 读取收到的数据，返回值表示本次实际读到的字节数。\n    std::size_t n = socket.read_some(boost::asio::buffer(data), ec);\n    if (ec)\n    {\n        std::cout \u003C\u003C \"client：读取失败：\" \u003C\u003C ec.message() \u003C\u003C std::endl;\n        return 1;\n    }\n\n    std::string reply(data.data(), n);\n    std::cout \u003C\u003C \"client：收到回显：\" \u003C\u003C reply;\n\n    return 0;\n}\n",[32,974,975,981,987,993,999,1005,1009,1025,1029,1037,1041,1045,1049,1059,1069,1073,1083,1123,1127,1144,1148,1153,1164,1170,1174,1199,1207,1211,1215,1232,1236,1256,1283,1289,1293,1318,1326,1330,1334,1351,1355,1371,1376,1406,1412,1416,1441,1449,1453,1457,1472,1488,1492,1500],{"__ignoreMap":30},[97,976,977,979],{"class":99,"line":100},[97,978,104],{"class":103},[97,980,108],{"class":107},[97,982,983,985],{"class":99,"line":111},[97,984,104],{"class":103},[97,986,116],{"class":107},[97,988,989,991],{"class":99,"line":119},[97,990,104],{"class":103},[97,992,124],{"class":107},[97,994,995,997],{"class":99,"line":127},[97,996,104],{"class":103},[97,998,132],{"class":107},[97,1000,1001,1003],{"class":99,"line":135},[97,1002,104],{"class":103},[97,1004,140],{"class":107},[97,1006,1007],{"class":99,"line":143},[97,1008,147],{"emptyLinePlaceholder":146},[97,1010,1011,1013,1015,1017,1019,1021,1023],{"class":99,"line":150},[97,1012,153],{"class":103},[97,1014,157],{"class":156},[97,1016,161],{"class":160},[97,1018,164],{"class":156},[97,1020,161],{"class":160},[97,1022,169],{"class":156},[97,1024,172],{"class":160},[97,1026,1027],{"class":99,"line":175},[97,1028,147],{"emptyLinePlaceholder":146},[97,1030,1031,1033,1035],{"class":99,"line":180},[97,1032,183],{"class":103},[97,1034,186],{"class":156},[97,1036,189],{"class":160},[97,1038,1039],{"class":99,"line":192},[97,1040,195],{"class":160},[97,1042,1043],{"class":99,"line":198},[97,1044,202],{"class":201},[97,1046,1047],{"class":99,"line":205},[97,1048,208],{"class":201},[97,1050,1051,1053,1055,1057],{"class":99,"line":211},[97,1052,214],{"class":156},[97,1054,161],{"class":160},[97,1056,164],{"class":156},[97,1058,221],{"class":160},[97,1060,1061,1063,1065,1067],{"class":99,"line":224},[97,1062,214],{"class":156},[97,1064,161],{"class":160},[97,1066,231],{"class":156},[97,1068,234],{"class":160},[97,1070,1071],{"class":99,"line":237},[97,1072,147],{"emptyLinePlaceholder":146},[97,1074,1075,1077,1079,1081],{"class":99,"line":242},[97,1076,251],{"class":156},[97,1078,330],{"class":160},[97,1080,333],{"class":156},[97,1082,336],{"class":160},[97,1084,1085,1087,1090,1093,1095,1097,1099,1101,1103,1105,1107,1110,1112,1115,1118,1120],{"class":99,"line":248},[97,1086,251],{"class":156},[97,1088,1089],{"class":160},"::endpoint ",[97,1091,1092],{"class":156},"server_endpoint",[97,1094,271],{"class":160},[97,1096,495],{"class":156},[97,1098,161],{"class":160},[97,1100,164],{"class":156},[97,1102,161],{"class":160},[97,1104,169],{"class":156},[97,1106,161],{"class":160},[97,1108,1109],{"class":156},"make_address",[97,1111,271],{"class":160},[97,1113,1114],{"class":107},"\"127.0.0.1\"",[97,1116,1117],{"class":160},"), ",[97,1119,285],{"class":284},[97,1121,1122],{"class":160},");\n",[97,1124,1125],{"class":99,"line":291},[97,1126,147],{"emptyLinePlaceholder":146},[97,1128,1129,1131,1133,1135,1138,1140,1142],{"class":99,"line":296},[97,1130,299],{"class":156},[97,1132,302],{"class":160},[97,1134,305],{"class":103},[97,1136,1137],{"class":107}," \"client：准备连接 127.0.0.1:9000\"",[97,1139,311],{"class":103},[97,1141,314],{"class":156},[97,1143,317],{"class":160},[97,1145,1146],{"class":99,"line":320},[97,1147,147],{"emptyLinePlaceholder":146},[97,1149,1150],{"class":99,"line":325},[97,1151,1152],{"class":201},"    \u002F\u002F 发起连接，成功后 socket 才能收发数据。\n",[97,1154,1155,1158,1161],{"class":99,"line":339},[97,1156,1157],{"class":160},"    socket.",[97,1159,1160],{"class":156},"connect",[97,1162,1163],{"class":160},"(server_endpoint, ec);\n",[97,1165,1166,1168],{"class":99,"line":345},[97,1167,360],{"class":103},[97,1169,363],{"class":160},[97,1171,1172],{"class":99,"line":357},[97,1173,369],{"class":160},[97,1175,1176,1178,1180,1182,1185,1187,1189,1191,1193,1195,1197],{"class":99,"line":366},[97,1177,375],{"class":156},[97,1179,302],{"class":160},[97,1181,305],{"class":103},[97,1183,1184],{"class":107}," \"client：连接失败：\"",[97,1186,311],{"class":103},[97,1188,387],{"class":160},[97,1190,390],{"class":156},[97,1192,393],{"class":160},[97,1194,305],{"class":103},[97,1196,314],{"class":156},[97,1198,317],{"class":160},[97,1200,1201,1203,1205],{"class":99,"line":372},[97,1202,405],{"class":103},[97,1204,408],{"class":284},[97,1206,411],{"class":160},[97,1208,1209],{"class":99,"line":402},[97,1210,417],{"class":160},[97,1212,1213],{"class":99,"line":414},[97,1214,147],{"emptyLinePlaceholder":146},[97,1216,1217,1219,1221,1223,1226,1228,1230],{"class":99,"line":420},[97,1218,299],{"class":156},[97,1220,302],{"class":160},[97,1222,305],{"class":103},[97,1224,1225],{"class":107}," \"client：连接成功\"",[97,1227,311],{"class":103},[97,1229,314],{"class":156},[97,1231,317],{"class":160},[97,1233,1234],{"class":99,"line":425},[97,1235,147],{"emptyLinePlaceholder":146},[97,1237,1238,1240,1243,1245,1248,1251,1254],{"class":99,"line":443},[97,1239,299],{"class":156},[97,1241,1242],{"class":160},"::string msg ",[97,1244,484],{"class":103},[97,1246,1247],{"class":107}," \"hello tcp",[97,1249,1250],{"class":284},"\\n",[97,1252,1253],{"class":107},"\"",[97,1255,411],{"class":160},[97,1257,1258,1260,1262,1264,1266,1268,1270,1272,1274,1276,1278,1280],{"class":99,"line":448},[97,1259,214],{"class":156},[97,1261,161],{"class":160},[97,1263,164],{"class":156},[97,1265,161],{"class":160},[97,1267,629],{"class":156},[97,1269,632],{"class":160},[97,1271,495],{"class":156},[97,1273,161],{"class":160},[97,1275,164],{"class":156},[97,1277,161],{"class":160},[97,1279,504],{"class":156},[97,1281,1282],{"class":160},"(msg), ec);\n",[97,1284,1285,1287],{"class":99,"line":471},[97,1286,360],{"class":103},[97,1288,363],{"class":160},[97,1290,1291],{"class":99,"line":510},[97,1292,369],{"class":160},[97,1294,1295,1297,1299,1301,1304,1306,1308,1310,1312,1314,1316],{"class":99,"line":517},[97,1296,375],{"class":156},[97,1298,302],{"class":160},[97,1300,305],{"class":103},[97,1302,1303],{"class":107}," \"client：发送失败：\"",[97,1305,311],{"class":103},[97,1307,387],{"class":160},[97,1309,390],{"class":156},[97,1311,393],{"class":160},[97,1313,305],{"class":103},[97,1315,314],{"class":156},[97,1317,317],{"class":160},[97,1319,1320,1322,1324],{"class":99,"line":522},[97,1321,405],{"class":103},[97,1323,408],{"class":284},[97,1325,411],{"class":160},[97,1327,1328],{"class":99,"line":548},[97,1329,417],{"class":160},[97,1331,1332],{"class":99,"line":557},[97,1333,147],{"emptyLinePlaceholder":146},[97,1335,1336,1338,1340,1342,1345,1347,1349],{"class":99,"line":562},[97,1337,299],{"class":156},[97,1339,302],{"class":160},[97,1341,305],{"class":103},[97,1343,1344],{"class":107}," \"client：发送完成，等待回显\"",[97,1346,311],{"class":103},[97,1348,314],{"class":156},[97,1350,317],{"class":160},[97,1352,1353],{"class":99,"line":567},[97,1354,147],{"emptyLinePlaceholder":146},[97,1356,1357,1359,1361,1363,1365,1367,1369],{"class":99,"line":587},[97,1358,299],{"class":156},[97,1360,453],{"class":160},[97,1362,456],{"class":103},[97,1364,459],{"class":160},[97,1366,462],{"class":284},[97,1368,465],{"class":103},[97,1370,468],{"class":160},[97,1372,1373],{"class":99,"line":613},[97,1374,1375],{"class":201},"    \u002F\u002F 读取收到的数据，返回值表示本次实际读到的字节数。\n",[97,1377,1378,1380,1382,1384,1386,1388,1390,1392,1394,1396,1398,1400,1402,1404],{"class":99,"line":618},[97,1379,299],{"class":156},[97,1381,161],{"class":160},[97,1383,478],{"class":103},[97,1385,481],{"class":160},[97,1387,484],{"class":103},[97,1389,487],{"class":160},[97,1391,490],{"class":156},[97,1393,271],{"class":160},[97,1395,495],{"class":156},[97,1397,161],{"class":160},[97,1399,164],{"class":156},[97,1401,161],{"class":160},[97,1403,504],{"class":156},[97,1405,507],{"class":160},[97,1407,1408,1410],{"class":99,"line":648},[97,1409,360],{"class":103},[97,1411,363],{"class":160},[97,1413,1414],{"class":99,"line":655},[97,1415,369],{"class":160},[97,1417,1418,1420,1422,1424,1427,1429,1431,1433,1435,1437,1439],{"class":99,"line":660},[97,1419,375],{"class":156},[97,1421,302],{"class":160},[97,1423,305],{"class":103},[97,1425,1426],{"class":107}," \"client：读取失败：\"",[97,1428,311],{"class":103},[97,1430,387],{"class":160},[97,1432,390],{"class":156},[97,1434,393],{"class":160},[97,1436,305],{"class":103},[97,1438,314],{"class":156},[97,1440,317],{"class":160},[97,1442,1443,1445,1447],{"class":99,"line":686},[97,1444,405],{"class":103},[97,1446,408],{"class":284},[97,1448,411],{"class":160},[97,1450,1451],{"class":99,"line":695},[97,1452,417],{"class":160},[97,1454,1455],{"class":99,"line":700},[97,1456,147],{"emptyLinePlaceholder":146},[97,1458,1459,1461,1463,1466,1468,1470],{"class":99,"line":705},[97,1460,299],{"class":156},[97,1462,572],{"class":160},[97,1464,1465],{"class":156},"reply",[97,1467,578],{"class":160},[97,1469,581],{"class":156},[97,1471,584],{"class":160},[97,1473,1474,1476,1478,1480,1483,1485],{"class":99,"line":723},[97,1475,299],{"class":156},[97,1477,302],{"class":160},[97,1479,305],{"class":103},[97,1481,1482],{"class":107}," \"client：收到回显：\"",[97,1484,311],{"class":103},[97,1486,1487],{"class":160}," reply;\n",[97,1489,1490],{"class":99,"line":728},[97,1491,147],{"emptyLinePlaceholder":146},[97,1493,1494,1496,1498],{"class":99,"line":739},[97,1495,731],{"class":103},[97,1497,734],{"class":284},[97,1499,411],{"class":160},[97,1501,1503],{"class":99,"line":1502},54,[97,1504,742],{"class":160},[13,1506,1507,749],{},[746,1508,748],{},[57,1510,752],{"id":1511},"編譯運行-1",[13,1513,1514],{},"終端 1：先運行示例 1 的服務端。",[24,1516,1517],{"className":758,"code":790,"language":760,"meta":30,"style":30},[32,1518,1519],{"__ignoreMap":30},[97,1520,1521],{"class":99,"line":100},[97,1522,790],{"class":156},[13,1524,1525],{},"終端 2：運行客戶端。",[24,1527,1529],{"className":758,"code":1528,"language":760,"meta":30,"style":30},"g++ demo2_tcp_sync_client.cpp -o demo2_tcp_sync_client -std=c++17 -lboost_system -pthread\n.\u002Fdemo2_tcp_sync_client\n",[32,1530,1531,1549],{"__ignoreMap":30},[97,1532,1533,1535,1538,1540,1543,1545,1547],{"class":99,"line":100},[97,1534,767],{"class":156},[97,1536,1537],{"class":107}," demo2_tcp_sync_client.cpp",[97,1539,773],{"class":284},[97,1541,1542],{"class":107}," demo2_tcp_sync_client",[97,1544,779],{"class":284},[97,1546,782],{"class":284},[97,1548,785],{"class":284},[97,1550,1551],{"class":99,"line":111},[97,1552,1553],{"class":156},".\u002Fdemo2_tcp_sync_client\n",[57,1555,825],{"id":1556},"運行輸出與時間順序-1",[13,1558,1559],{},"客戶端輸出：",[24,1561,1564],{"className":1562,"code":1563,"language":29,"meta":30},[27],"client：准备连接 127.0.0.1:9000\nclient：连接成功\nclient：发送完成，等待回显\nclient：收到回显：hello tcp\n",[32,1565,1563],{"__ignoreMap":30},[13,1567,1568],{},"服務端輸出：",[24,1570,1573],{"className":1571,"code":1572,"language":29,"meta":30},[27],"server：监听 0.0.0.0:9000，等待客户端连接\nserver：客户端已连接\nserver：收到 10 字节：hello tcp\nserver：已原样回写，程序结束\n",[32,1574,1572],{"__ignoreMap":30},[57,1576,872],{"id":1577},"本示例需要注意的點-1",[13,1579,1580],{},"客戶端必須在服務端已經監聽後再運行，否則會連接失敗：",[24,1582,1585],{"className":1583,"code":1584,"language":29,"meta":30},[27],"Connection refused\n",[32,1586,1584],{"__ignoreMap":30},[57,1588,1590,1593],{"id":1589},"socketconnect-說明",[32,1591,1592],{},"socket.connect()"," 說明",[24,1595,1597],{"className":91,"code":1596,"language":93,"meta":30,"style":30},"socket.connect(server_endpoint, ec);\n",[32,1598,1599],{"__ignoreMap":30},[97,1600,1601,1604,1606],{"class":99,"line":100},[97,1602,1603],{"class":160},"socket.",[97,1605,1160],{"class":156},[97,1607,1163],{"class":160},[13,1609,1610],{},"作用：同步連接服務器。",[13,1612,1613,1614,1616],{},"連接成功後，後續可以通過同一個 ",[32,1615,333],{}," 進行讀寫。",[46,1618],{},[49,1620,1622],{"id":1621},"示例-3類裏寫異步-tcp-echo-session","示例 3：類裏寫異步 TCP Echo Session",[57,1624,59],{"id":1625},"程序目標-2",[13,1627,1628],{},"寫一個異步 TCP Echo Server：",[64,1630,1631,1634,1640,1643,1646],{},[67,1632,1633],{},"異步接受客戶端連接；",[67,1635,1636,1637,73],{},"每個連接創建一個 ",[32,1638,1639],{},"EchoSession",[67,1641,1642],{},"異步讀取客戶端數據；",[67,1644,1645],{},"異步寫回客戶端；",[67,1647,1648],{},"繼續讀取下一段數據。",[57,1650,88],{"id":1651},"完整代碼-2",[24,1653,1655],{"className":91,"code":1654,"language":93,"meta":30,"style":30},"#include \u003Cboost\u002Fasio.hpp>\n#include \u003Cboost\u002Fsystem\u002Ferror_code.hpp>\n#include \u003Carray>\n#include \u003Cfunctional>\n#include \u003Ciostream>\n#include \u003Cmemory>\n\nusing boost::asio::ip::tcp;\n\nclass EchoSession : public std::enable_shared_from_this\u003CEchoSession>\n{\npublic:\n    explicit EchoSession(boost::asio::io_context& io)\n        : socket_(io)\n    {\n    }\n\n    tcp::socket& socket()\n    {\n        return socket_;\n    }\n\n    void start()\n    {\n        std::cout \u003C\u003C \"session：开始读取客户端数据\" \u003C\u003C std::endl;\n        do_read();\n    }\n\nprivate:\n    void do_read()\n    {\n        socket_.async_read_some(boost::asio::buffer(data_),\n                                std::bind(&EchoSession::on_read,\n                                          shared_from_this(),\n                                          std::placeholders::_1,\n                                          std::placeholders::_2));\n    }\n\n    void on_read(const boost::system::error_code& ec, std::size_t length)\n    {\n        if (ec)\n        {\n            std::cout \u003C\u003C \"session：读取结束或失败：\" \u003C\u003C ec.message() \u003C\u003C std::endl;\n            return;\n        }\n\n        std::cout \u003C\u003C \"session：收到 \" \u003C\u003C length \u003C\u003C \" 字节，准备回写\" \u003C\u003C std::endl;\n\n        boost::asio::async_write(socket_,\n                                 boost::asio::buffer(data_, length),\n                                 std::bind(&EchoSession::on_write,\n                                           shared_from_this(),\n                                           std::placeholders::_1,\n                                           std::placeholders::_2));\n    }\n\n    void on_write(const boost::system::error_code& ec, std::size_t length)\n    {\n        if (ec)\n        {\n            std::cout \u003C\u003C \"session：写失败：\" \u003C\u003C ec.message() \u003C\u003C std::endl;\n            return;\n        }\n\n        std::cout \u003C\u003C \"session：回写完成，字节数 = \" \u003C\u003C length \u003C\u003C std::endl;\n\n        do_read();\n    }\n\nprivate:\n    tcp::socket socket_;\n    std::array\u003Cchar, 1024> data_;\n};\n\nclass EchoServer\n{\npublic:\n    EchoServer(boost::asio::io_context& io, unsigned short port)\n        : io_(io),\n          acceptor_(io, tcp::endpoint(tcp::v4(), port))\n    {\n        std::cout \u003C\u003C \"server：监听端口 \" \u003C\u003C port \u003C\u003C std::endl;\n        do_accept();\n    }\n\nprivate:\n    void do_accept()\n    {\n        std::shared_ptr\u003CEchoSession> session = std::make_shared\u003CEchoSession>(io_);\n\n        acceptor_.async_accept(session->socket(),\n                               std::bind(&EchoServer::on_accept,\n                                         this,\n                                         session,\n                                         std::placeholders::_1));\n    }\n\n    void on_accept(std::shared_ptr\u003CEchoSession> session,\n                   const boost::system::error_code& ec)\n    {\n        if (ec)\n        {\n            std::cout \u003C\u003C \"server：accept 失败：\" \u003C\u003C ec.message() \u003C\u003C std::endl;\n        }\n        else\n        {\n            std::cout \u003C\u003C \"server：有新客户端连接\" \u003C\u003C std::endl;\n            session->start();\n        }\n\n        do_accept();\n    }\n\nprivate:\n    boost::asio::io_context& io_;\n    \u002F\u002F acceptor 负责监听 TCP 端口并接收客户端连接。\n    tcp::acceptor acceptor_;\n};\n\nint main()\n{\n    \u002F\u002F 程序从 main 函数开始执行，下面的语句会按顺序运行。\n    \u002F\u002F io_context 是 Asio 的事件循环对象，异步任务需要靠它调度。\n    boost::asio::io_context io;\n    EchoServer server(io, 9000);\n\n    std::cout \u003C\u003C \"main：调用 io.run()，服务端开始运行\" \u003C\u003C std::endl;\n\n    \u002F\u002F 启动事件循环，前面注册的异步任务会在这里被调度执行。\n    io.run();\n\n    std::cout \u003C\u003C \"main：io.run() 返回\" \u003C\u003C std::endl;\n\n    return 0;\n}\n",[32,1656,1657,1663,1669,1675,1682,1688,1695,1699,1715,1719,1748,1752,1757,1787,1798,1802,1806,1810,1825,1829,1836,1840,1844,1854,1858,1875,1883,1887,1891,1896,1905,1909,1932,1951,1959,1972,1983,1987,1991,2033,2037,2044,2049,2075,2082,2087,2091,2118,2122,2139,2155,2173,2180,2191,2201,2206,2211,2249,2254,2261,2266,2292,2299,2304,2309,2331,2336,2343,2348,2353,2358,2366,2384,2390,2395,2403,2408,2413,2448,2459,2484,2489,2512,2520,2525,2530,2535,2545,2550,2583,2588,2604,2624,2633,2639,2652,2657,2662,2691,2713,2718,2725,2730,2755,2760,2766,2771,2789,2800,2805,2810,2817,2822,2827,2832,2849,2854,2862,2867,2872,2881,2886,2891,2896,2907,2922,2927,2945,2950,2956,2967,2972,2990,2995,3004],{"__ignoreMap":30},[97,1658,1659,1661],{"class":99,"line":100},[97,1660,104],{"class":103},[97,1662,108],{"class":107},[97,1664,1665,1667],{"class":99,"line":111},[97,1666,104],{"class":103},[97,1668,116],{"class":107},[97,1670,1671,1673],{"class":99,"line":119},[97,1672,104],{"class":103},[97,1674,124],{"class":107},[97,1676,1677,1679],{"class":99,"line":127},[97,1678,104],{"class":103},[97,1680,1681],{"class":107}," \u003Cfunctional>\n",[97,1683,1684,1686],{"class":99,"line":135},[97,1685,104],{"class":103},[97,1687,132],{"class":107},[97,1689,1690,1692],{"class":99,"line":143},[97,1691,104],{"class":103},[97,1693,1694],{"class":107}," \u003Cmemory>\n",[97,1696,1697],{"class":99,"line":150},[97,1698,147],{"emptyLinePlaceholder":146},[97,1700,1701,1703,1705,1707,1709,1711,1713],{"class":99,"line":175},[97,1702,153],{"class":103},[97,1704,157],{"class":156},[97,1706,161],{"class":160},[97,1708,164],{"class":156},[97,1710,161],{"class":160},[97,1712,169],{"class":156},[97,1714,172],{"class":160},[97,1716,1717],{"class":99,"line":180},[97,1718,147],{"emptyLinePlaceholder":146},[97,1720,1721,1724,1727,1730,1733,1735,1737,1740,1743,1745],{"class":99,"line":192},[97,1722,1723],{"class":103},"class",[97,1725,1726],{"class":156}," EchoSession",[97,1728,1729],{"class":160}," : ",[97,1731,1732],{"class":103},"public",[97,1734,314],{"class":156},[97,1736,161],{"class":160},[97,1738,1739],{"class":156},"enable_shared_from_this",[97,1741,1742],{"class":160},"\u003C",[97,1744,1639],{"class":156},[97,1746,1747],{"class":160},">\n",[97,1749,1750],{"class":99,"line":198},[97,1751,195],{"class":160},[97,1753,1754],{"class":99,"line":205},[97,1755,1756],{"class":103},"public:\n",[97,1758,1759,1762,1764,1766,1768,1770,1772,1774,1777,1780,1784],{"class":99,"line":211},[97,1760,1761],{"class":103},"    explicit",[97,1763,1726],{"class":156},[97,1765,271],{"class":160},[97,1767,495],{"class":156},[97,1769,161],{"class":160},[97,1771,164],{"class":156},[97,1773,161],{"class":160},[97,1775,1776],{"class":156},"io_context",[97,1778,1779],{"class":103},"&",[97,1781,1783],{"class":1782},"s4XuR"," io",[97,1785,1786],{"class":160},")\n",[97,1788,1789,1792,1795],{"class":99,"line":224},[97,1790,1791],{"class":160},"        : ",[97,1793,1794],{"class":156},"socket_",[97,1796,1797],{"class":160},"(io)\n",[97,1799,1800],{"class":99,"line":237},[97,1801,369],{"class":160},[97,1803,1804],{"class":99,"line":242},[97,1805,417],{"class":160},[97,1807,1808],{"class":99,"line":248},[97,1809,147],{"emptyLinePlaceholder":146},[97,1811,1812,1814,1816,1818,1820,1823],{"class":99,"line":291},[97,1813,251],{"class":156},[97,1815,161],{"class":160},[97,1817,333],{"class":156},[97,1819,1779],{"class":103},[97,1821,1822],{"class":156}," socket",[97,1824,189],{"class":160},[97,1826,1827],{"class":99,"line":296},[97,1828,369],{"class":160},[97,1830,1831,1833],{"class":99,"line":320},[97,1832,405],{"class":103},[97,1834,1835],{"class":160}," socket_;\n",[97,1837,1838],{"class":99,"line":325},[97,1839,417],{"class":160},[97,1841,1842],{"class":99,"line":339},[97,1843,147],{"emptyLinePlaceholder":146},[97,1845,1846,1849,1852],{"class":99,"line":345},[97,1847,1848],{"class":103},"    void",[97,1850,1851],{"class":156}," start",[97,1853,189],{"class":160},[97,1855,1856],{"class":99,"line":357},[97,1857,369],{"class":160},[97,1859,1860,1862,1864,1866,1869,1871,1873],{"class":99,"line":366},[97,1861,375],{"class":156},[97,1863,302],{"class":160},[97,1865,305],{"class":103},[97,1867,1868],{"class":107}," \"session：开始读取客户端数据\"",[97,1870,311],{"class":103},[97,1872,314],{"class":156},[97,1874,317],{"class":160},[97,1876,1877,1880],{"class":99,"line":372},[97,1878,1879],{"class":156},"        do_read",[97,1881,1882],{"class":160},"();\n",[97,1884,1885],{"class":99,"line":402},[97,1886,417],{"class":160},[97,1888,1889],{"class":99,"line":414},[97,1890,147],{"emptyLinePlaceholder":146},[97,1892,1893],{"class":99,"line":420},[97,1894,1895],{"class":103},"private:\n",[97,1897,1898,1900,1903],{"class":99,"line":425},[97,1899,1848],{"class":103},[97,1901,1902],{"class":156}," do_read",[97,1904,189],{"class":160},[97,1906,1907],{"class":99,"line":443},[97,1908,369],{"class":160},[97,1910,1911,1914,1917,1919,1921,1923,1925,1927,1929],{"class":99,"line":448},[97,1912,1913],{"class":160},"        socket_.",[97,1915,1916],{"class":156},"async_read_some",[97,1918,271],{"class":160},[97,1920,495],{"class":156},[97,1922,161],{"class":160},[97,1924,164],{"class":156},[97,1926,161],{"class":160},[97,1928,504],{"class":156},[97,1930,1931],{"class":160},"(data_),\n",[97,1933,1934,1937,1939,1942,1944,1946,1948],{"class":99,"line":471},[97,1935,1936],{"class":156},"                                std",[97,1938,161],{"class":160},[97,1940,1941],{"class":156},"bind",[97,1943,271],{"class":160},[97,1945,1779],{"class":103},[97,1947,1639],{"class":156},[97,1949,1950],{"class":160},"::on_read,\n",[97,1952,1953,1956],{"class":99,"line":510},[97,1954,1955],{"class":156},"                                          shared_from_this",[97,1957,1958],{"class":160},"(),\n",[97,1960,1961,1964,1966,1969],{"class":99,"line":517},[97,1962,1963],{"class":156},"                                          std",[97,1965,161],{"class":160},[97,1967,1968],{"class":156},"placeholders",[97,1970,1971],{"class":160},"::_1,\n",[97,1973,1974,1976,1978,1980],{"class":99,"line":522},[97,1975,1963],{"class":156},[97,1977,161],{"class":160},[97,1979,1968],{"class":156},[97,1981,1982],{"class":160},"::_2));\n",[97,1984,1985],{"class":99,"line":548},[97,1986,417],{"class":160},[97,1988,1989],{"class":99,"line":557},[97,1990,147],{"emptyLinePlaceholder":146},[97,1992,1993,1995,1998,2000,2003,2005,2007,2009,2011,2014,2016,2019,2021,2024,2026,2028,2031],{"class":99,"line":562},[97,1994,1848],{"class":103},[97,1996,1997],{"class":156}," on_read",[97,1999,271],{"class":160},[97,2001,2002],{"class":103},"const",[97,2004,157],{"class":156},[97,2006,161],{"class":160},[97,2008,231],{"class":156},[97,2010,161],{"class":160},[97,2012,2013],{"class":156},"error_code",[97,2015,1779],{"class":103},[97,2017,2018],{"class":1782}," ec",[97,2020,459],{"class":160},[97,2022,2023],{"class":156},"std",[97,2025,161],{"class":160},[97,2027,478],{"class":103},[97,2029,2030],{"class":1782}," length",[97,2032,1786],{"class":160},[97,2034,2035],{"class":99,"line":567},[97,2036,369],{"class":160},[97,2038,2039,2042],{"class":99,"line":587},[97,2040,2041],{"class":103},"        if",[97,2043,363],{"class":160},[97,2045,2046],{"class":99,"line":613},[97,2047,2048],{"class":160},"        {\n",[97,2050,2051,2054,2056,2058,2061,2063,2065,2067,2069,2071,2073],{"class":99,"line":618},[97,2052,2053],{"class":156},"            std",[97,2055,302],{"class":160},[97,2057,305],{"class":103},[97,2059,2060],{"class":107}," \"session：读取结束或失败：\"",[97,2062,311],{"class":103},[97,2064,387],{"class":160},[97,2066,390],{"class":156},[97,2068,393],{"class":160},[97,2070,305],{"class":103},[97,2072,314],{"class":156},[97,2074,317],{"class":160},[97,2076,2077,2080],{"class":99,"line":648},[97,2078,2079],{"class":103},"            return",[97,2081,411],{"class":160},[97,2083,2084],{"class":99,"line":655},[97,2085,2086],{"class":160},"        }\n",[97,2088,2089],{"class":99,"line":660},[97,2090,147],{"emptyLinePlaceholder":146},[97,2092,2093,2095,2097,2099,2102,2104,2107,2109,2112,2114,2116],{"class":99,"line":686},[97,2094,375],{"class":156},[97,2096,302],{"class":160},[97,2098,305],{"class":103},[97,2100,2101],{"class":107}," \"session：收到 \"",[97,2103,311],{"class":103},[97,2105,2106],{"class":160}," length ",[97,2108,305],{"class":103},[97,2110,2111],{"class":107}," \" 字节，准备回写\"",[97,2113,311],{"class":103},[97,2115,314],{"class":156},[97,2117,317],{"class":160},[97,2119,2120],{"class":99,"line":695},[97,2121,147],{"emptyLinePlaceholder":146},[97,2123,2124,2127,2129,2131,2133,2136],{"class":99,"line":700},[97,2125,2126],{"class":156},"        boost",[97,2128,161],{"class":160},[97,2130,164],{"class":156},[97,2132,161],{"class":160},[97,2134,2135],{"class":156},"async_write",[97,2137,2138],{"class":160},"(socket_,\n",[97,2140,2141,2144,2146,2148,2150,2152],{"class":99,"line":705},[97,2142,2143],{"class":156},"                                 boost",[97,2145,161],{"class":160},[97,2147,164],{"class":156},[97,2149,161],{"class":160},[97,2151,504],{"class":156},[97,2153,2154],{"class":160},"(data_, length),\n",[97,2156,2157,2160,2162,2164,2166,2168,2170],{"class":99,"line":723},[97,2158,2159],{"class":156},"                                 std",[97,2161,161],{"class":160},[97,2163,1941],{"class":156},[97,2165,271],{"class":160},[97,2167,1779],{"class":103},[97,2169,1639],{"class":156},[97,2171,2172],{"class":160},"::on_write,\n",[97,2174,2175,2178],{"class":99,"line":728},[97,2176,2177],{"class":156},"                                           shared_from_this",[97,2179,1958],{"class":160},[97,2181,2182,2185,2187,2189],{"class":99,"line":739},[97,2183,2184],{"class":156},"                                           std",[97,2186,161],{"class":160},[97,2188,1968],{"class":156},[97,2190,1971],{"class":160},[97,2192,2193,2195,2197,2199],{"class":99,"line":1502},[97,2194,2184],{"class":156},[97,2196,161],{"class":160},[97,2198,1968],{"class":156},[97,2200,1982],{"class":160},[97,2202,2204],{"class":99,"line":2203},55,[97,2205,417],{"class":160},[97,2207,2209],{"class":99,"line":2208},56,[97,2210,147],{"emptyLinePlaceholder":146},[97,2212,2214,2216,2219,2221,2223,2225,2227,2229,2231,2233,2235,2237,2239,2241,2243,2245,2247],{"class":99,"line":2213},57,[97,2215,1848],{"class":103},[97,2217,2218],{"class":156}," on_write",[97,2220,271],{"class":160},[97,2222,2002],{"class":103},[97,2224,157],{"class":156},[97,2226,161],{"class":160},[97,2228,231],{"class":156},[97,2230,161],{"class":160},[97,2232,2013],{"class":156},[97,2234,1779],{"class":103},[97,2236,2018],{"class":1782},[97,2238,459],{"class":160},[97,2240,2023],{"class":156},[97,2242,161],{"class":160},[97,2244,478],{"class":103},[97,2246,2030],{"class":1782},[97,2248,1786],{"class":160},[97,2250,2252],{"class":99,"line":2251},58,[97,2253,369],{"class":160},[97,2255,2257,2259],{"class":99,"line":2256},59,[97,2258,2041],{"class":103},[97,2260,363],{"class":160},[97,2262,2264],{"class":99,"line":2263},60,[97,2265,2048],{"class":160},[97,2267,2269,2271,2273,2275,2278,2280,2282,2284,2286,2288,2290],{"class":99,"line":2268},61,[97,2270,2053],{"class":156},[97,2272,302],{"class":160},[97,2274,305],{"class":103},[97,2276,2277],{"class":107}," \"session：写失败：\"",[97,2279,311],{"class":103},[97,2281,387],{"class":160},[97,2283,390],{"class":156},[97,2285,393],{"class":160},[97,2287,305],{"class":103},[97,2289,314],{"class":156},[97,2291,317],{"class":160},[97,2293,2295,2297],{"class":99,"line":2294},62,[97,2296,2079],{"class":103},[97,2298,411],{"class":160},[97,2300,2302],{"class":99,"line":2301},63,[97,2303,2086],{"class":160},[97,2305,2307],{"class":99,"line":2306},64,[97,2308,147],{"emptyLinePlaceholder":146},[97,2310,2312,2314,2316,2318,2321,2323,2325,2327,2329],{"class":99,"line":2311},65,[97,2313,375],{"class":156},[97,2315,302],{"class":160},[97,2317,305],{"class":103},[97,2319,2320],{"class":107}," \"session：回写完成，字节数 = \"",[97,2322,311],{"class":103},[97,2324,2106],{"class":160},[97,2326,305],{"class":103},[97,2328,314],{"class":156},[97,2330,317],{"class":160},[97,2332,2334],{"class":99,"line":2333},66,[97,2335,147],{"emptyLinePlaceholder":146},[97,2337,2339,2341],{"class":99,"line":2338},67,[97,2340,1879],{"class":156},[97,2342,1882],{"class":160},[97,2344,2346],{"class":99,"line":2345},68,[97,2347,417],{"class":160},[97,2349,2351],{"class":99,"line":2350},69,[97,2352,147],{"emptyLinePlaceholder":146},[97,2354,2356],{"class":99,"line":2355},70,[97,2357,1895],{"class":103},[97,2359,2361,2363],{"class":99,"line":2360},71,[97,2362,251],{"class":156},[97,2364,2365],{"class":160},"::socket socket_;\n",[97,2367,2369,2371,2373,2375,2377,2379,2381],{"class":99,"line":2368},72,[97,2370,299],{"class":156},[97,2372,453],{"class":160},[97,2374,456],{"class":103},[97,2376,459],{"class":160},[97,2378,462],{"class":284},[97,2380,465],{"class":103},[97,2382,2383],{"class":160}," data_;\n",[97,2385,2387],{"class":99,"line":2386},73,[97,2388,2389],{"class":160},"};\n",[97,2391,2393],{"class":99,"line":2392},74,[97,2394,147],{"emptyLinePlaceholder":146},[97,2396,2398,2400],{"class":99,"line":2397},75,[97,2399,1723],{"class":103},[97,2401,2402],{"class":156}," EchoServer\n",[97,2404,2406],{"class":99,"line":2405},76,[97,2407,195],{"class":160},[97,2409,2411],{"class":99,"line":2410},77,[97,2412,1756],{"class":103},[97,2414,2416,2419,2421,2423,2425,2427,2429,2431,2433,2435,2437,2440,2443,2446],{"class":99,"line":2415},78,[97,2417,2418],{"class":156},"    EchoServer",[97,2420,271],{"class":160},[97,2422,495],{"class":156},[97,2424,161],{"class":160},[97,2426,164],{"class":156},[97,2428,161],{"class":160},[97,2430,1776],{"class":156},[97,2432,1779],{"class":103},[97,2434,1783],{"class":1782},[97,2436,459],{"class":160},[97,2438,2439],{"class":103},"unsigned",[97,2441,2442],{"class":103}," short",[97,2444,2445],{"class":1782}," port",[97,2447,1786],{"class":160},[97,2449,2451,2453,2456],{"class":99,"line":2450},79,[97,2452,1791],{"class":160},[97,2454,2455],{"class":156},"io_",[97,2457,2458],{"class":160},"(io),\n",[97,2460,2462,2465,2467,2469,2471,2473,2475,2477,2479,2481],{"class":99,"line":2461},80,[97,2463,2464],{"class":156},"          acceptor_",[97,2466,260],{"class":160},[97,2468,263],{"class":156},[97,2470,161],{"class":160},[97,2472,268],{"class":156},[97,2474,271],{"class":160},[97,2476,263],{"class":156},[97,2478,161],{"class":160},[97,2480,278],{"class":156},[97,2482,2483],{"class":160},"(), port))\n",[97,2485,2487],{"class":99,"line":2486},81,[97,2488,369],{"class":160},[97,2490,2492,2494,2496,2498,2501,2503,2506,2508,2510],{"class":99,"line":2491},82,[97,2493,375],{"class":156},[97,2495,302],{"class":160},[97,2497,305],{"class":103},[97,2499,2500],{"class":107}," \"server：监听端口 \"",[97,2502,311],{"class":103},[97,2504,2505],{"class":160}," port ",[97,2507,305],{"class":103},[97,2509,314],{"class":156},[97,2511,317],{"class":160},[97,2513,2515,2518],{"class":99,"line":2514},83,[97,2516,2517],{"class":156},"        do_accept",[97,2519,1882],{"class":160},[97,2521,2523],{"class":99,"line":2522},84,[97,2524,417],{"class":160},[97,2526,2528],{"class":99,"line":2527},85,[97,2529,147],{"emptyLinePlaceholder":146},[97,2531,2533],{"class":99,"line":2532},86,[97,2534,1895],{"class":103},[97,2536,2538,2540,2543],{"class":99,"line":2537},87,[97,2539,1848],{"class":103},[97,2541,2542],{"class":156}," do_accept",[97,2544,189],{"class":160},[97,2546,2548],{"class":99,"line":2547},88,[97,2549,369],{"class":160},[97,2551,2553,2555,2558,2560,2562,2564,2567,2569,2571,2573,2576,2578,2580],{"class":99,"line":2552},89,[97,2554,375],{"class":156},[97,2556,2557],{"class":160},"::shared_ptr",[97,2559,1742],{"class":103},[97,2561,1639],{"class":160},[97,2563,465],{"class":103},[97,2565,2566],{"class":160}," session ",[97,2568,484],{"class":103},[97,2570,314],{"class":156},[97,2572,161],{"class":160},[97,2574,2575],{"class":156},"make_shared",[97,2577,1742],{"class":160},[97,2579,1639],{"class":156},[97,2581,2582],{"class":160},">(io_);\n",[97,2584,2586],{"class":99,"line":2585},90,[97,2587,147],{"emptyLinePlaceholder":146},[97,2589,2591,2594,2597,2600,2602],{"class":99,"line":2590},91,[97,2592,2593],{"class":160},"        acceptor_.",[97,2595,2596],{"class":156},"async_accept",[97,2598,2599],{"class":160},"(session->",[97,2601,333],{"class":156},[97,2603,1958],{"class":160},[97,2605,2607,2610,2612,2614,2616,2618,2621],{"class":99,"line":2606},92,[97,2608,2609],{"class":156},"                               std",[97,2611,161],{"class":160},[97,2613,1941],{"class":156},[97,2615,271],{"class":160},[97,2617,1779],{"class":103},[97,2619,2620],{"class":156},"EchoServer",[97,2622,2623],{"class":160},"::on_accept,\n",[97,2625,2627,2630],{"class":99,"line":2626},93,[97,2628,2629],{"class":284},"                                         this",[97,2631,2632],{"class":160},",\n",[97,2634,2636],{"class":99,"line":2635},94,[97,2637,2638],{"class":160},"                                         session,\n",[97,2640,2642,2645,2647,2649],{"class":99,"line":2641},95,[97,2643,2644],{"class":156},"                                         std",[97,2646,161],{"class":160},[97,2648,1968],{"class":156},[97,2650,2651],{"class":160},"::_1));\n",[97,2653,2655],{"class":99,"line":2654},96,[97,2656,417],{"class":160},[97,2658,2660],{"class":99,"line":2659},97,[97,2661,147],{"emptyLinePlaceholder":146},[97,2663,2665,2667,2670,2672,2674,2676,2679,2681,2683,2686,2689],{"class":99,"line":2664},98,[97,2666,1848],{"class":103},[97,2668,2669],{"class":156}," on_accept",[97,2671,271],{"class":160},[97,2673,2023],{"class":156},[97,2675,161],{"class":160},[97,2677,2678],{"class":156},"shared_ptr",[97,2680,1742],{"class":160},[97,2682,1639],{"class":156},[97,2684,2685],{"class":160},"> ",[97,2687,2688],{"class":1782},"session",[97,2690,2632],{"class":160},[97,2692,2694,2697,2699,2701,2703,2705,2707,2709,2711],{"class":99,"line":2693},99,[97,2695,2696],{"class":103},"                   const",[97,2698,157],{"class":156},[97,2700,161],{"class":160},[97,2702,231],{"class":156},[97,2704,161],{"class":160},[97,2706,2013],{"class":156},[97,2708,1779],{"class":103},[97,2710,2018],{"class":1782},[97,2712,1786],{"class":160},[97,2714,2716],{"class":99,"line":2715},100,[97,2717,369],{"class":160},[97,2719,2721,2723],{"class":99,"line":2720},101,[97,2722,2041],{"class":103},[97,2724,363],{"class":160},[97,2726,2728],{"class":99,"line":2727},102,[97,2729,2048],{"class":160},[97,2731,2733,2735,2737,2739,2741,2743,2745,2747,2749,2751,2753],{"class":99,"line":2732},103,[97,2734,2053],{"class":156},[97,2736,302],{"class":160},[97,2738,305],{"class":103},[97,2740,382],{"class":107},[97,2742,311],{"class":103},[97,2744,387],{"class":160},[97,2746,390],{"class":156},[97,2748,393],{"class":160},[97,2750,305],{"class":103},[97,2752,314],{"class":156},[97,2754,317],{"class":160},[97,2756,2758],{"class":99,"line":2757},104,[97,2759,2086],{"class":160},[97,2761,2763],{"class":99,"line":2762},105,[97,2764,2765],{"class":103},"        else\n",[97,2767,2769],{"class":99,"line":2768},106,[97,2770,2048],{"class":160},[97,2772,2774,2776,2778,2780,2783,2785,2787],{"class":99,"line":2773},107,[97,2775,2053],{"class":156},[97,2777,302],{"class":160},[97,2779,305],{"class":103},[97,2781,2782],{"class":107}," \"server：有新客户端连接\"",[97,2784,311],{"class":103},[97,2786,314],{"class":156},[97,2788,317],{"class":160},[97,2790,2792,2795,2798],{"class":99,"line":2791},108,[97,2793,2794],{"class":160},"            session->",[97,2796,2797],{"class":156},"start",[97,2799,1882],{"class":160},[97,2801,2803],{"class":99,"line":2802},109,[97,2804,2086],{"class":160},[97,2806,2808],{"class":99,"line":2807},110,[97,2809,147],{"emptyLinePlaceholder":146},[97,2811,2813,2815],{"class":99,"line":2812},111,[97,2814,2517],{"class":156},[97,2816,1882],{"class":160},[97,2818,2820],{"class":99,"line":2819},112,[97,2821,417],{"class":160},[97,2823,2825],{"class":99,"line":2824},113,[97,2826,147],{"emptyLinePlaceholder":146},[97,2828,2830],{"class":99,"line":2829},114,[97,2831,1895],{"class":103},[97,2833,2835,2837,2839,2841,2844,2846],{"class":99,"line":2834},115,[97,2836,214],{"class":156},[97,2838,161],{"class":160},[97,2840,164],{"class":156},[97,2842,2843],{"class":160},"::io_context",[97,2845,1779],{"class":103},[97,2847,2848],{"class":160}," io_;\n",[97,2850,2852],{"class":99,"line":2851},116,[97,2853,245],{"class":201},[97,2855,2857,2859],{"class":99,"line":2856},117,[97,2858,251],{"class":156},[97,2860,2861],{"class":160},"::acceptor acceptor_;\n",[97,2863,2865],{"class":99,"line":2864},118,[97,2866,2389],{"class":160},[97,2868,2870],{"class":99,"line":2869},119,[97,2871,147],{"emptyLinePlaceholder":146},[97,2873,2875,2877,2879],{"class":99,"line":2874},120,[97,2876,183],{"class":103},[97,2878,186],{"class":156},[97,2880,189],{"class":160},[97,2882,2884],{"class":99,"line":2883},121,[97,2885,195],{"class":160},[97,2887,2889],{"class":99,"line":2888},122,[97,2890,202],{"class":201},[97,2892,2894],{"class":99,"line":2893},123,[97,2895,208],{"class":201},[97,2897,2899,2901,2903,2905],{"class":99,"line":2898},124,[97,2900,214],{"class":156},[97,2902,161],{"class":160},[97,2904,164],{"class":156},[97,2906,221],{"class":160},[97,2908,2910,2913,2916,2918,2920],{"class":99,"line":2909},125,[97,2911,2912],{"class":160},"    EchoServer ",[97,2914,2915],{"class":156},"server",[97,2917,260],{"class":160},[97,2919,285],{"class":284},[97,2921,1122],{"class":160},[97,2923,2925],{"class":99,"line":2924},126,[97,2926,147],{"emptyLinePlaceholder":146},[97,2928,2930,2932,2934,2936,2939,2941,2943],{"class":99,"line":2929},127,[97,2931,299],{"class":156},[97,2933,302],{"class":160},[97,2935,305],{"class":103},[97,2937,2938],{"class":107}," \"main：调用 io.run()，服务端开始运行\"",[97,2940,311],{"class":103},[97,2942,314],{"class":156},[97,2944,317],{"class":160},[97,2946,2948],{"class":99,"line":2947},128,[97,2949,147],{"emptyLinePlaceholder":146},[97,2951,2953],{"class":99,"line":2952},129,[97,2954,2955],{"class":201},"    \u002F\u002F 启动事件循环，前面注册的异步任务会在这里被调度执行。\n",[97,2957,2959,2962,2965],{"class":99,"line":2958},130,[97,2960,2961],{"class":160},"    io.",[97,2963,2964],{"class":156},"run",[97,2966,1882],{"class":160},[97,2968,2970],{"class":99,"line":2969},131,[97,2971,147],{"emptyLinePlaceholder":146},[97,2973,2975,2977,2979,2981,2984,2986,2988],{"class":99,"line":2974},132,[97,2976,299],{"class":156},[97,2978,302],{"class":160},[97,2980,305],{"class":103},[97,2982,2983],{"class":107}," \"main：io.run() 返回\"",[97,2985,311],{"class":103},[97,2987,314],{"class":156},[97,2989,317],{"class":160},[97,2991,2993],{"class":99,"line":2992},133,[97,2994,147],{"emptyLinePlaceholder":146},[97,2996,2998,3000,3002],{"class":99,"line":2997},134,[97,2999,731],{"class":103},[97,3001,734],{"class":284},[97,3003,411],{"class":160},[97,3005,3007],{"class":99,"line":3006},135,[97,3008,742],{"class":160},[13,3010,3011,749],{},[746,3012,748],{},[57,3014,752],{"id":3015},"編譯運行-2",[13,3017,3018],{},"終端 1：運行異步服務端。",[24,3020,3022],{"className":758,"code":3021,"language":760,"meta":30,"style":30},"g++ demo3_async_tcp_echo_server.cpp -o demo3_async_tcp_echo_server -std=c++17 -lboost_system -pthread\n.\u002Fdemo3_async_tcp_echo_server\n",[32,3023,3024,3042],{"__ignoreMap":30},[97,3025,3026,3028,3031,3033,3036,3038,3040],{"class":99,"line":100},[97,3027,767],{"class":156},[97,3029,3030],{"class":107}," demo3_async_tcp_echo_server.cpp",[97,3032,773],{"class":284},[97,3034,3035],{"class":107}," demo3_async_tcp_echo_server",[97,3037,779],{"class":284},[97,3039,782],{"class":284},[97,3041,785],{"class":284},[97,3043,3044],{"class":99,"line":111},[97,3045,3046],{"class":156},".\u002Fdemo3_async_tcp_echo_server\n",[13,3048,3049],{},"終端 2：連接測試。",[24,3051,3053],{"className":758,"code":3052,"language":760,"meta":30,"style":30},"nc 127.0.0.1 9000\n",[32,3054,3055],{"__ignoreMap":30},[97,3056,3057,3059,3061],{"class":99,"line":100},[97,3058,796],{"class":156},[97,3060,819],{"class":284},[97,3062,822],{"class":284},[13,3064,3065],{},"然後輸入：",[24,3067,3070],{"className":3068,"code":3069,"language":29,"meta":30},[27],"hello\nrobot\n",[32,3071,3069],{"__ignoreMap":30},[57,3073,825],{"id":3074},"運行輸出與時間順序-2",[13,3076,3077],{},"服務端啓動後輸出：",[24,3079,3082],{"className":3080,"code":3081,"language":29,"meta":30},[27],"server：监听端口 9000\nmain：调用 io.run()，服务端开始运行\n",[32,3083,3081],{"__ignoreMap":30},[13,3085,3086],{},"客戶端連接後：",[24,3088,3091],{"className":3089,"code":3090,"language":29,"meta":30},[27],"server：有新客户端连接\nsession：开始读取客户端数据\n",[32,3092,3090],{"__ignoreMap":30},[13,3094,3095,3096,3099],{},"客戶端輸入 ",[32,3097,3098],{},"hello"," 回車後，服務端輸出：",[24,3101,3104],{"className":3102,"code":3103,"language":29,"meta":30},[27],"session：收到 6 字节，准备回写\nsession：回写完成，字节数 = 6\n",[32,3105,3103],{"__ignoreMap":30},[13,3107,3108],{},"客戶端會看到回顯：",[24,3110,3113],{"className":3111,"code":3112,"language":29,"meta":30},[27],"hello\n",[32,3114,3112],{"__ignoreMap":30},[13,3116,3117,3118,3099],{},"繼續輸入 ",[32,3119,3120],{},"robot",[24,3122,3124],{"className":3123,"code":3103,"language":29,"meta":30},[27],[32,3125,3103],{"__ignoreMap":30},[57,3127,872],{"id":3128},"本示例需要注意的點-2",[13,3130,3131],{},"這個程序不會自動退出，因爲服務端持續調用：",[24,3133,3135],{"className":91,"code":3134,"language":93,"meta":30,"style":30},"do_accept();\ndo_read();\n",[32,3136,3137,3144],{"__ignoreMap":30},[97,3138,3139,3142],{"class":99,"line":100},[97,3140,3141],{"class":156},"do_accept",[97,3143,1882],{"class":160},[97,3145,3146,3149],{"class":99,"line":111},[97,3147,3148],{"class":156},"do_read",[97,3150,1882],{"class":160},[13,3152,3153,3154,3157],{},"所以 ",[32,3155,3156],{},"io.run()"," 會一直運行。",[57,3159,3161,1593],{"id":3160},"shared_from_this-說明",[32,3162,3163],{},"shared_from_this()",[13,3165,3166],{},"異步 session 最容易出問題的是對象生命週期。",[13,3168,3169,3170,3172],{},"如果回調還沒執行，",[32,3171,1639],{}," 對象已經被釋放，就會崩潰。",[13,3174,3175],{},"所以這裏用：",[24,3177,3179],{"className":91,"code":3178,"language":93,"meta":30,"style":30},"std::enable_shared_from_this\u003CEchoSession>\nshared_from_this()\n",[32,3180,3181,3194],{"__ignoreMap":30},[97,3182,3183,3185,3188,3190,3192],{"class":99,"line":100},[97,3184,2023],{"class":156},[97,3186,3187],{"class":160},"::enable_shared_from_this",[97,3189,1742],{"class":103},[97,3191,1639],{"class":160},[97,3193,1747],{"class":103},[97,3195,3196,3199],{"class":99,"line":111},[97,3197,3198],{"class":156},"shared_from_this",[97,3200,189],{"class":160},[13,3202,3203,3204,3206,3207,3209],{},"讓異步回調持有 ",[32,3205,1639],{}," 的 ",[32,3208,2678],{},"，保證回調執行時對象還活着。",[57,3211,3213,1593],{"id":3212},"async_read_some-說明",[32,3214,3215],{},"async_read_some()",[24,3217,3219],{"className":91,"code":3218,"language":93,"meta":30,"style":30},"socket_.async_read_some(buffer, handler);\n",[32,3220,3221],{"__ignoreMap":30},[97,3222,3223,3226,3228],{"class":99,"line":100},[97,3224,3225],{"class":160},"socket_.",[97,3227,1916],{"class":156},[97,3229,3230],{"class":160},"(buffer, handler);\n",[13,3232,3233],{},"作用：異步讀取當前到達的一些字節。",[13,3235,3236],{},"回調參數：",[24,3238,3240],{"className":91,"code":3239,"language":93,"meta":30,"style":30},"const boost::system::error_code& ec\nstd::size_t length\n",[32,3241,3242,3260],{"__ignoreMap":30},[97,3243,3244,3246,3248,3250,3252,3255,3257],{"class":99,"line":100},[97,3245,2002],{"class":103},[97,3247,157],{"class":156},[97,3249,161],{"class":160},[97,3251,231],{"class":156},[97,3253,3254],{"class":160},"::error_code",[97,3256,1779],{"class":103},[97,3258,3259],{"class":160}," ec\n",[97,3261,3262,3264,3266,3268],{"class":99,"line":111},[97,3263,2023],{"class":156},[97,3265,161],{"class":160},[97,3267,478],{"class":103},[97,3269,3270],{"class":160}," length\n",[13,3272,3273],{},"注意：它不保證讀到完整一條消息。",[46,3275],{},[49,3277,3279],{"id":3278},"示例-4類裏寫異步-tcp-client","示例 4：類裏寫異步 TCP Client",[57,3281,59],{"id":3282},"程序目標-3",[13,3284,3285],{},"寫一個異步 TCP 客戶端：",[64,3287,3288,3291,3294,3297],{},[67,3289,3290],{},"異步連接服務器；",[67,3292,3293],{},"連接成功後發送一行數據；",[67,3295,3296],{},"讀取服務端回顯；",[67,3298,85],{},[57,3300,88],{"id":3301},"完整代碼-3",[24,3303,3305],{"className":91,"code":3304,"language":93,"meta":30,"style":30},"#include \u003Cboost\u002Fasio.hpp>\n#include \u003Cboost\u002Fsystem\u002Ferror_code.hpp>\n#include \u003Carray>\n#include \u003Cfunctional>\n#include \u003Ciostream>\n#include \u003Cmemory>\n#include \u003Cstring>\n\nusing boost::asio::ip::tcp;\n\nclass TcpClient\n{\npublic:\n    TcpClient(boost::asio::io_context& io,\n              const std::string& host,\n              unsigned short port)\n        : socket_(io),\n          endpoint_(boost::asio::ip::make_address(host), port),\n          msg_(\"hello async tcp\\n\")\n    {\n    }\n\n    void start()\n    {\n        std::cout \u003C\u003C \"client：开始异步连接\" \u003C\u003C std::endl;\n\n        socket_.async_connect(endpoint_,\n                              std::bind(&TcpClient::on_connect,\n                                        this,\n                                        std::placeholders::_1));\n    }\n\nprivate:\n    void on_connect(const boost::system::error_code& ec)\n    {\n        if (ec)\n        {\n            std::cout \u003C\u003C \"client：连接失败：\" \u003C\u003C ec.message() \u003C\u003C std::endl;\n            return;\n        }\n\n        std::cout \u003C\u003C \"client：连接成功，开始异步发送\" \u003C\u003C std::endl;\n\n        boost::asio::async_write(socket_,\n                                 boost::asio::buffer(msg_),\n                                 std::bind(&TcpClient::on_write,\n                                           this,\n                                           std::placeholders::_1,\n                                           std::placeholders::_2));\n    }\n\n    void on_write(const boost::system::error_code& ec, std::size_t length)\n    {\n        if (ec)\n        {\n            std::cout \u003C\u003C \"client：发送失败：\" \u003C\u003C ec.message() \u003C\u003C std::endl;\n            return;\n        }\n\n        std::cout \u003C\u003C \"client：发送完成，字节数 = \" \u003C\u003C length \u003C\u003C \"，等待回显\" \u003C\u003C std::endl;\n\n        \u002F\u002F 读取收到的数据，返回值表示本次实际读到的字节数。\n        socket_.async_read_some(boost::asio::buffer(data_),\n                                std::bind(&TcpClient::on_read,\n                                          this,\n                                          std::placeholders::_1,\n                                          std::placeholders::_2));\n    }\n\n    void on_read(const boost::system::error_code& ec, std::size_t length)\n    {\n        if (ec)\n        {\n            std::cout \u003C\u003C \"client：读取失败：\" \u003C\u003C ec.message() \u003C\u003C std::endl;\n            return;\n        }\n\n        std::string reply(data_.data(), length);\n        std::cout \u003C\u003C \"client：收到回显：\" \u003C\u003C reply;\n    }\n\nprivate:\n    tcp::socket socket_;\n    tcp::endpoint endpoint_;\n    std::string msg_;\n    std::array\u003Cchar, 1024> data_;\n};\n\nint main()\n{\n    \u002F\u002F 程序从 main 函数开始执行，下面的语句会按顺序运行。\n    \u002F\u002F io_context 是 Asio 的事件循环对象，异步任务需要靠它调度。\n    boost::asio::io_context io;\n\n    TcpClient client(io, \"127.0.0.1\", 9000);\n    client.start();\n\n    std::cout \u003C\u003C \"main：调用 io.run()\" \u003C\u003C std::endl;\n\n    \u002F\u002F 启动事件循环，前面注册的异步任务会在这里被调度执行。\n    io.run();\n\n    std::cout \u003C\u003C \"main：io.run() 返回\" \u003C\u003C std::endl;\n\n    return 0;\n}\n",[32,3306,3307,3313,3319,3325,3331,3337,3343,3349,3353,3369,3373,3380,3384,3388,3411,3430,3441,3449,3473,3489,3493,3497,3501,3509,3513,3530,3534,3544,3563,3570,3581,3585,3589,3593,3620,3624,3630,3634,3658,3664,3668,3672,3689,3693,3707,3722,3738,3745,3755,3765,3769,3773,3809,3813,3819,3823,3847,3853,3857,3861,3887,3891,3896,3916,3932,3939,3949,3959,3963,3967,4003,4007,4013,4017,4041,4047,4051,4055,4071,4085,4089,4093,4097,4103,4110,4117,4133,4137,4141,4149,4153,4157,4161,4171,4175,4193,4202,4206,4223,4227,4231,4239,4243,4259,4263,4271],{"__ignoreMap":30},[97,3308,3309,3311],{"class":99,"line":100},[97,3310,104],{"class":103},[97,3312,108],{"class":107},[97,3314,3315,3317],{"class":99,"line":111},[97,3316,104],{"class":103},[97,3318,116],{"class":107},[97,3320,3321,3323],{"class":99,"line":119},[97,3322,104],{"class":103},[97,3324,124],{"class":107},[97,3326,3327,3329],{"class":99,"line":127},[97,3328,104],{"class":103},[97,3330,1681],{"class":107},[97,3332,3333,3335],{"class":99,"line":135},[97,3334,104],{"class":103},[97,3336,132],{"class":107},[97,3338,3339,3341],{"class":99,"line":143},[97,3340,104],{"class":103},[97,3342,1694],{"class":107},[97,3344,3345,3347],{"class":99,"line":150},[97,3346,104],{"class":103},[97,3348,140],{"class":107},[97,3350,3351],{"class":99,"line":175},[97,3352,147],{"emptyLinePlaceholder":146},[97,3354,3355,3357,3359,3361,3363,3365,3367],{"class":99,"line":180},[97,3356,153],{"class":103},[97,3358,157],{"class":156},[97,3360,161],{"class":160},[97,3362,164],{"class":156},[97,3364,161],{"class":160},[97,3366,169],{"class":156},[97,3368,172],{"class":160},[97,3370,3371],{"class":99,"line":192},[97,3372,147],{"emptyLinePlaceholder":146},[97,3374,3375,3377],{"class":99,"line":198},[97,3376,1723],{"class":103},[97,3378,3379],{"class":156}," TcpClient\n",[97,3381,3382],{"class":99,"line":205},[97,3383,195],{"class":160},[97,3385,3386],{"class":99,"line":211},[97,3387,1756],{"class":103},[97,3389,3390,3393,3395,3397,3399,3401,3403,3405,3407,3409],{"class":99,"line":224},[97,3391,3392],{"class":156},"    TcpClient",[97,3394,271],{"class":160},[97,3396,495],{"class":156},[97,3398,161],{"class":160},[97,3400,164],{"class":156},[97,3402,161],{"class":160},[97,3404,1776],{"class":156},[97,3406,1779],{"class":103},[97,3408,1783],{"class":1782},[97,3410,2632],{"class":160},[97,3412,3413,3416,3418,3420,3423,3425,3428],{"class":99,"line":237},[97,3414,3415],{"class":103},"              const",[97,3417,314],{"class":156},[97,3419,161],{"class":160},[97,3421,3422],{"class":156},"string",[97,3424,1779],{"class":103},[97,3426,3427],{"class":1782}," host",[97,3429,2632],{"class":160},[97,3431,3432,3435,3437,3439],{"class":99,"line":242},[97,3433,3434],{"class":103},"              unsigned",[97,3436,2442],{"class":103},[97,3438,2445],{"class":1782},[97,3440,1786],{"class":160},[97,3442,3443,3445,3447],{"class":99,"line":248},[97,3444,1791],{"class":160},[97,3446,1794],{"class":156},[97,3448,2458],{"class":160},[97,3450,3451,3454,3456,3458,3460,3462,3464,3466,3468,3470],{"class":99,"line":291},[97,3452,3453],{"class":156},"          endpoint_",[97,3455,271],{"class":160},[97,3457,495],{"class":156},[97,3459,161],{"class":160},[97,3461,164],{"class":156},[97,3463,161],{"class":160},[97,3465,169],{"class":156},[97,3467,161],{"class":160},[97,3469,1109],{"class":156},[97,3471,3472],{"class":160},"(host), port),\n",[97,3474,3475,3478,3480,3483,3485,3487],{"class":99,"line":296},[97,3476,3477],{"class":156},"          msg_",[97,3479,271],{"class":160},[97,3481,3482],{"class":107},"\"hello async tcp",[97,3484,1250],{"class":284},[97,3486,1253],{"class":107},[97,3488,1786],{"class":160},[97,3490,3491],{"class":99,"line":320},[97,3492,369],{"class":160},[97,3494,3495],{"class":99,"line":325},[97,3496,417],{"class":160},[97,3498,3499],{"class":99,"line":339},[97,3500,147],{"emptyLinePlaceholder":146},[97,3502,3503,3505,3507],{"class":99,"line":345},[97,3504,1848],{"class":103},[97,3506,1851],{"class":156},[97,3508,189],{"class":160},[97,3510,3511],{"class":99,"line":357},[97,3512,369],{"class":160},[97,3514,3515,3517,3519,3521,3524,3526,3528],{"class":99,"line":366},[97,3516,375],{"class":156},[97,3518,302],{"class":160},[97,3520,305],{"class":103},[97,3522,3523],{"class":107}," \"client：开始异步连接\"",[97,3525,311],{"class":103},[97,3527,314],{"class":156},[97,3529,317],{"class":160},[97,3531,3532],{"class":99,"line":372},[97,3533,147],{"emptyLinePlaceholder":146},[97,3535,3536,3538,3541],{"class":99,"line":402},[97,3537,1913],{"class":160},[97,3539,3540],{"class":156},"async_connect",[97,3542,3543],{"class":160},"(endpoint_,\n",[97,3545,3546,3549,3551,3553,3555,3557,3560],{"class":99,"line":414},[97,3547,3548],{"class":156},"                              std",[97,3550,161],{"class":160},[97,3552,1941],{"class":156},[97,3554,271],{"class":160},[97,3556,1779],{"class":103},[97,3558,3559],{"class":156},"TcpClient",[97,3561,3562],{"class":160},"::on_connect,\n",[97,3564,3565,3568],{"class":99,"line":420},[97,3566,3567],{"class":284},"                                        this",[97,3569,2632],{"class":160},[97,3571,3572,3575,3577,3579],{"class":99,"line":425},[97,3573,3574],{"class":156},"                                        std",[97,3576,161],{"class":160},[97,3578,1968],{"class":156},[97,3580,2651],{"class":160},[97,3582,3583],{"class":99,"line":443},[97,3584,417],{"class":160},[97,3586,3587],{"class":99,"line":448},[97,3588,147],{"emptyLinePlaceholder":146},[97,3590,3591],{"class":99,"line":471},[97,3592,1895],{"class":103},[97,3594,3595,3597,3600,3602,3604,3606,3608,3610,3612,3614,3616,3618],{"class":99,"line":510},[97,3596,1848],{"class":103},[97,3598,3599],{"class":156}," on_connect",[97,3601,271],{"class":160},[97,3603,2002],{"class":103},[97,3605,157],{"class":156},[97,3607,161],{"class":160},[97,3609,231],{"class":156},[97,3611,161],{"class":160},[97,3613,2013],{"class":156},[97,3615,1779],{"class":103},[97,3617,2018],{"class":1782},[97,3619,1786],{"class":160},[97,3621,3622],{"class":99,"line":517},[97,3623,369],{"class":160},[97,3625,3626,3628],{"class":99,"line":522},[97,3627,2041],{"class":103},[97,3629,363],{"class":160},[97,3631,3632],{"class":99,"line":548},[97,3633,2048],{"class":160},[97,3635,3636,3638,3640,3642,3644,3646,3648,3650,3652,3654,3656],{"class":99,"line":557},[97,3637,2053],{"class":156},[97,3639,302],{"class":160},[97,3641,305],{"class":103},[97,3643,1184],{"class":107},[97,3645,311],{"class":103},[97,3647,387],{"class":160},[97,3649,390],{"class":156},[97,3651,393],{"class":160},[97,3653,305],{"class":103},[97,3655,314],{"class":156},[97,3657,317],{"class":160},[97,3659,3660,3662],{"class":99,"line":562},[97,3661,2079],{"class":103},[97,3663,411],{"class":160},[97,3665,3666],{"class":99,"line":567},[97,3667,2086],{"class":160},[97,3669,3670],{"class":99,"line":587},[97,3671,147],{"emptyLinePlaceholder":146},[97,3673,3674,3676,3678,3680,3683,3685,3687],{"class":99,"line":613},[97,3675,375],{"class":156},[97,3677,302],{"class":160},[97,3679,305],{"class":103},[97,3681,3682],{"class":107}," \"client：连接成功，开始异步发送\"",[97,3684,311],{"class":103},[97,3686,314],{"class":156},[97,3688,317],{"class":160},[97,3690,3691],{"class":99,"line":618},[97,3692,147],{"emptyLinePlaceholder":146},[97,3694,3695,3697,3699,3701,3703,3705],{"class":99,"line":648},[97,3696,2126],{"class":156},[97,3698,161],{"class":160},[97,3700,164],{"class":156},[97,3702,161],{"class":160},[97,3704,2135],{"class":156},[97,3706,2138],{"class":160},[97,3708,3709,3711,3713,3715,3717,3719],{"class":99,"line":655},[97,3710,2143],{"class":156},[97,3712,161],{"class":160},[97,3714,164],{"class":156},[97,3716,161],{"class":160},[97,3718,504],{"class":156},[97,3720,3721],{"class":160},"(msg_),\n",[97,3723,3724,3726,3728,3730,3732,3734,3736],{"class":99,"line":660},[97,3725,2159],{"class":156},[97,3727,161],{"class":160},[97,3729,1941],{"class":156},[97,3731,271],{"class":160},[97,3733,1779],{"class":103},[97,3735,3559],{"class":156},[97,3737,2172],{"class":160},[97,3739,3740,3743],{"class":99,"line":686},[97,3741,3742],{"class":284},"                                           this",[97,3744,2632],{"class":160},[97,3746,3747,3749,3751,3753],{"class":99,"line":695},[97,3748,2184],{"class":156},[97,3750,161],{"class":160},[97,3752,1968],{"class":156},[97,3754,1971],{"class":160},[97,3756,3757,3759,3761,3763],{"class":99,"line":700},[97,3758,2184],{"class":156},[97,3760,161],{"class":160},[97,3762,1968],{"class":156},[97,3764,1982],{"class":160},[97,3766,3767],{"class":99,"line":705},[97,3768,417],{"class":160},[97,3770,3771],{"class":99,"line":723},[97,3772,147],{"emptyLinePlaceholder":146},[97,3774,3775,3777,3779,3781,3783,3785,3787,3789,3791,3793,3795,3797,3799,3801,3803,3805,3807],{"class":99,"line":728},[97,3776,1848],{"class":103},[97,3778,2218],{"class":156},[97,3780,271],{"class":160},[97,3782,2002],{"class":103},[97,3784,157],{"class":156},[97,3786,161],{"class":160},[97,3788,231],{"class":156},[97,3790,161],{"class":160},[97,3792,2013],{"class":156},[97,3794,1779],{"class":103},[97,3796,2018],{"class":1782},[97,3798,459],{"class":160},[97,3800,2023],{"class":156},[97,3802,161],{"class":160},[97,3804,478],{"class":103},[97,3806,2030],{"class":1782},[97,3808,1786],{"class":160},[97,3810,3811],{"class":99,"line":739},[97,3812,369],{"class":160},[97,3814,3815,3817],{"class":99,"line":1502},[97,3816,2041],{"class":103},[97,3818,363],{"class":160},[97,3820,3821],{"class":99,"line":2203},[97,3822,2048],{"class":160},[97,3824,3825,3827,3829,3831,3833,3835,3837,3839,3841,3843,3845],{"class":99,"line":2208},[97,3826,2053],{"class":156},[97,3828,302],{"class":160},[97,3830,305],{"class":103},[97,3832,1303],{"class":107},[97,3834,311],{"class":103},[97,3836,387],{"class":160},[97,3838,390],{"class":156},[97,3840,393],{"class":160},[97,3842,305],{"class":103},[97,3844,314],{"class":156},[97,3846,317],{"class":160},[97,3848,3849,3851],{"class":99,"line":2213},[97,3850,2079],{"class":103},[97,3852,411],{"class":160},[97,3854,3855],{"class":99,"line":2251},[97,3856,2086],{"class":160},[97,3858,3859],{"class":99,"line":2256},[97,3860,147],{"emptyLinePlaceholder":146},[97,3862,3863,3865,3867,3869,3872,3874,3876,3878,3881,3883,3885],{"class":99,"line":2263},[97,3864,375],{"class":156},[97,3866,302],{"class":160},[97,3868,305],{"class":103},[97,3870,3871],{"class":107}," \"client：发送完成，字节数 = \"",[97,3873,311],{"class":103},[97,3875,2106],{"class":160},[97,3877,305],{"class":103},[97,3879,3880],{"class":107}," \"，等待回显\"",[97,3882,311],{"class":103},[97,3884,314],{"class":156},[97,3886,317],{"class":160},[97,3888,3889],{"class":99,"line":2268},[97,3890,147],{"emptyLinePlaceholder":146},[97,3892,3893],{"class":99,"line":2294},[97,3894,3895],{"class":201},"        \u002F\u002F 读取收到的数据，返回值表示本次实际读到的字节数。\n",[97,3897,3898,3900,3902,3904,3906,3908,3910,3912,3914],{"class":99,"line":2301},[97,3899,1913],{"class":160},[97,3901,1916],{"class":156},[97,3903,271],{"class":160},[97,3905,495],{"class":156},[97,3907,161],{"class":160},[97,3909,164],{"class":156},[97,3911,161],{"class":160},[97,3913,504],{"class":156},[97,3915,1931],{"class":160},[97,3917,3918,3920,3922,3924,3926,3928,3930],{"class":99,"line":2306},[97,3919,1936],{"class":156},[97,3921,161],{"class":160},[97,3923,1941],{"class":156},[97,3925,271],{"class":160},[97,3927,1779],{"class":103},[97,3929,3559],{"class":156},[97,3931,1950],{"class":160},[97,3933,3934,3937],{"class":99,"line":2311},[97,3935,3936],{"class":284},"                                          this",[97,3938,2632],{"class":160},[97,3940,3941,3943,3945,3947],{"class":99,"line":2333},[97,3942,1963],{"class":156},[97,3944,161],{"class":160},[97,3946,1968],{"class":156},[97,3948,1971],{"class":160},[97,3950,3951,3953,3955,3957],{"class":99,"line":2338},[97,3952,1963],{"class":156},[97,3954,161],{"class":160},[97,3956,1968],{"class":156},[97,3958,1982],{"class":160},[97,3960,3961],{"class":99,"line":2345},[97,3962,417],{"class":160},[97,3964,3965],{"class":99,"line":2350},[97,3966,147],{"emptyLinePlaceholder":146},[97,3968,3969,3971,3973,3975,3977,3979,3981,3983,3985,3987,3989,3991,3993,3995,3997,3999,4001],{"class":99,"line":2355},[97,3970,1848],{"class":103},[97,3972,1997],{"class":156},[97,3974,271],{"class":160},[97,3976,2002],{"class":103},[97,3978,157],{"class":156},[97,3980,161],{"class":160},[97,3982,231],{"class":156},[97,3984,161],{"class":160},[97,3986,2013],{"class":156},[97,3988,1779],{"class":103},[97,3990,2018],{"class":1782},[97,3992,459],{"class":160},[97,3994,2023],{"class":156},[97,3996,161],{"class":160},[97,3998,478],{"class":103},[97,4000,2030],{"class":1782},[97,4002,1786],{"class":160},[97,4004,4005],{"class":99,"line":2360},[97,4006,369],{"class":160},[97,4008,4009,4011],{"class":99,"line":2368},[97,4010,2041],{"class":103},[97,4012,363],{"class":160},[97,4014,4015],{"class":99,"line":2386},[97,4016,2048],{"class":160},[97,4018,4019,4021,4023,4025,4027,4029,4031,4033,4035,4037,4039],{"class":99,"line":2392},[97,4020,2053],{"class":156},[97,4022,302],{"class":160},[97,4024,305],{"class":103},[97,4026,1426],{"class":107},[97,4028,311],{"class":103},[97,4030,387],{"class":160},[97,4032,390],{"class":156},[97,4034,393],{"class":160},[97,4036,305],{"class":103},[97,4038,314],{"class":156},[97,4040,317],{"class":160},[97,4042,4043,4045],{"class":99,"line":2397},[97,4044,2079],{"class":103},[97,4046,411],{"class":160},[97,4048,4049],{"class":99,"line":2405},[97,4050,2086],{"class":160},[97,4052,4053],{"class":99,"line":2410},[97,4054,147],{"emptyLinePlaceholder":146},[97,4056,4057,4059,4061,4063,4066,4068],{"class":99,"line":2415},[97,4058,375],{"class":156},[97,4060,572],{"class":160},[97,4062,1465],{"class":156},[97,4064,4065],{"class":160},"(data_.",[97,4067,581],{"class":156},[97,4069,4070],{"class":160},"(), length);\n",[97,4072,4073,4075,4077,4079,4081,4083],{"class":99,"line":2450},[97,4074,375],{"class":156},[97,4076,302],{"class":160},[97,4078,305],{"class":103},[97,4080,1482],{"class":107},[97,4082,311],{"class":103},[97,4084,1487],{"class":160},[97,4086,4087],{"class":99,"line":2461},[97,4088,417],{"class":160},[97,4090,4091],{"class":99,"line":2486},[97,4092,147],{"emptyLinePlaceholder":146},[97,4094,4095],{"class":99,"line":2491},[97,4096,1895],{"class":103},[97,4098,4099,4101],{"class":99,"line":2514},[97,4100,251],{"class":156},[97,4102,2365],{"class":160},[97,4104,4105,4107],{"class":99,"line":2522},[97,4106,251],{"class":156},[97,4108,4109],{"class":160},"::endpoint endpoint_;\n",[97,4111,4112,4114],{"class":99,"line":2527},[97,4113,299],{"class":156},[97,4115,4116],{"class":160},"::string msg_;\n",[97,4118,4119,4121,4123,4125,4127,4129,4131],{"class":99,"line":2532},[97,4120,299],{"class":156},[97,4122,453],{"class":160},[97,4124,456],{"class":103},[97,4126,459],{"class":160},[97,4128,462],{"class":284},[97,4130,465],{"class":103},[97,4132,2383],{"class":160},[97,4134,4135],{"class":99,"line":2537},[97,4136,2389],{"class":160},[97,4138,4139],{"class":99,"line":2547},[97,4140,147],{"emptyLinePlaceholder":146},[97,4142,4143,4145,4147],{"class":99,"line":2552},[97,4144,183],{"class":103},[97,4146,186],{"class":156},[97,4148,189],{"class":160},[97,4150,4151],{"class":99,"line":2585},[97,4152,195],{"class":160},[97,4154,4155],{"class":99,"line":2590},[97,4156,202],{"class":201},[97,4158,4159],{"class":99,"line":2606},[97,4160,208],{"class":201},[97,4162,4163,4165,4167,4169],{"class":99,"line":2626},[97,4164,214],{"class":156},[97,4166,161],{"class":160},[97,4168,164],{"class":156},[97,4170,221],{"class":160},[97,4172,4173],{"class":99,"line":2635},[97,4174,147],{"emptyLinePlaceholder":146},[97,4176,4177,4180,4183,4185,4187,4189,4191],{"class":99,"line":2641},[97,4178,4179],{"class":160},"    TcpClient ",[97,4181,4182],{"class":156},"client",[97,4184,260],{"class":160},[97,4186,1114],{"class":107},[97,4188,459],{"class":160},[97,4190,285],{"class":284},[97,4192,1122],{"class":160},[97,4194,4195,4198,4200],{"class":99,"line":2654},[97,4196,4197],{"class":160},"    client.",[97,4199,2797],{"class":156},[97,4201,1882],{"class":160},[97,4203,4204],{"class":99,"line":2659},[97,4205,147],{"emptyLinePlaceholder":146},[97,4207,4208,4210,4212,4214,4217,4219,4221],{"class":99,"line":2664},[97,4209,299],{"class":156},[97,4211,302],{"class":160},[97,4213,305],{"class":103},[97,4215,4216],{"class":107}," \"main：调用 io.run()\"",[97,4218,311],{"class":103},[97,4220,314],{"class":156},[97,4222,317],{"class":160},[97,4224,4225],{"class":99,"line":2693},[97,4226,147],{"emptyLinePlaceholder":146},[97,4228,4229],{"class":99,"line":2715},[97,4230,2955],{"class":201},[97,4232,4233,4235,4237],{"class":99,"line":2720},[97,4234,2961],{"class":160},[97,4236,2964],{"class":156},[97,4238,1882],{"class":160},[97,4240,4241],{"class":99,"line":2727},[97,4242,147],{"emptyLinePlaceholder":146},[97,4244,4245,4247,4249,4251,4253,4255,4257],{"class":99,"line":2732},[97,4246,299],{"class":156},[97,4248,302],{"class":160},[97,4250,305],{"class":103},[97,4252,2983],{"class":107},[97,4254,311],{"class":103},[97,4256,314],{"class":156},[97,4258,317],{"class":160},[97,4260,4261],{"class":99,"line":2757},[97,4262,147],{"emptyLinePlaceholder":146},[97,4264,4265,4267,4269],{"class":99,"line":2762},[97,4266,731],{"class":103},[97,4268,734],{"class":284},[97,4270,411],{"class":160},[97,4272,4273],{"class":99,"line":2768},[97,4274,742],{"class":160},[13,4276,4277,749],{},[746,4278,748],{},[57,4280,752],{"id":4281},"編譯運行-3",[13,4283,4284],{},"終端 1：先運行示例 3 的異步服務端。",[24,4286,4287],{"className":758,"code":3046,"language":760,"meta":30,"style":30},[32,4288,4289],{"__ignoreMap":30},[97,4290,4291],{"class":99,"line":100},[97,4292,3046],{"class":156},[13,4294,1525],{},[24,4296,4298],{"className":758,"code":4297,"language":760,"meta":30,"style":30},"g++ demo4_async_tcp_client.cpp -o demo4_async_tcp_client -std=c++17 -lboost_system -pthread\n.\u002Fdemo4_async_tcp_client\n",[32,4299,4300,4318],{"__ignoreMap":30},[97,4301,4302,4304,4307,4309,4312,4314,4316],{"class":99,"line":100},[97,4303,767],{"class":156},[97,4305,4306],{"class":107}," demo4_async_tcp_client.cpp",[97,4308,773],{"class":284},[97,4310,4311],{"class":107}," demo4_async_tcp_client",[97,4313,779],{"class":284},[97,4315,782],{"class":284},[97,4317,785],{"class":284},[97,4319,4320],{"class":99,"line":111},[97,4321,4322],{"class":156},".\u002Fdemo4_async_tcp_client\n",[57,4324,825],{"id":4325},"運行輸出與時間順序-3",[13,4327,1559],{},[24,4329,4332],{"className":4330,"code":4331,"language":29,"meta":30},[27],"client：开始异步连接\nmain：调用 io.run()\nclient：连接成功，开始异步发送\nclient：发送完成，字节数 = 16，等待回显\nclient：收到回显：hello async tcp\nmain：io.run() 返回\n",[32,4333,4331],{"__ignoreMap":30},[13,4335,4336],{},"服務端輸出類似：",[24,4338,4341],{"className":4339,"code":4340,"language":29,"meta":30},[27],"server：有新客户端连接\nsession：开始读取客户端数据\nsession：收到 16 字节，准备回写\nsession：回写完成，字节数 = 16\nsession：读取结束或失败：End of file\n",[32,4342,4340],{"__ignoreMap":30},[57,4344,872],{"id":4345},"本示例需要注意的點-3",[13,4347,4348,4351,4352,4355],{},[32,4349,4350],{},"msg_"," 和 ",[32,4353,4354],{},"data_"," 都是成員變量，是爲了保證異步寫和異步讀期間內存一直有效。",[13,4357,4358,4359,4362],{},"不要在 ",[32,4360,4361],{},"on_connect()"," 裏寫這種危險代碼：",[24,4364,4366],{"className":91,"code":4365,"language":93,"meta":30,"style":30},"std::string msg = \"hello\\n\";\nboost::asio::async_write(socket_, boost::asio::buffer(msg), handler);\n",[32,4367,4368,4385],{"__ignoreMap":30},[97,4369,4370,4372,4374,4376,4379,4381,4383],{"class":99,"line":100},[97,4371,2023],{"class":156},[97,4373,1242],{"class":160},[97,4375,484],{"class":103},[97,4377,4378],{"class":107}," \"hello",[97,4380,1250],{"class":284},[97,4382,1253],{"class":107},[97,4384,411],{"class":160},[97,4386,4387,4389,4391,4393,4395,4397,4400,4402,4404,4406,4408,4410],{"class":99,"line":111},[97,4388,495],{"class":156},[97,4390,161],{"class":160},[97,4392,164],{"class":156},[97,4394,161],{"class":160},[97,4396,2135],{"class":156},[97,4398,4399],{"class":160},"(socket_, ",[97,4401,495],{"class":156},[97,4403,161],{"class":160},[97,4405,164],{"class":156},[97,4407,161],{"class":160},[97,4409,504],{"class":156},[97,4411,4412],{"class":160},"(msg), handler);\n",[13,4414,4415,4416,4418,4419,4421],{},"因爲 ",[32,4417,4361],{}," 返回後，",[32,4420,575],{}," 就銷燬了。",[46,4423],{},[49,4425,4427],{"id":4426},"tcp-粘包和半包提醒","TCP 粘包和半包提醒",[13,4429,4430],{},"TCP 是字節流。你發送三次：",[24,4432,4435],{"className":4433,"code":4434,"language":29,"meta":30},[27],"A\nB\nC\n",[32,4436,4434],{"__ignoreMap":30},[13,4438,4439],{},"接收端可能一次讀到：",[24,4441,4444],{"className":4442,"code":4443,"language":29,"meta":30},[27],"ABC\n",[32,4445,4443],{"__ignoreMap":30},[13,4447,4448],{},"也可能分兩次讀到：",[24,4450,4453],{"className":4451,"code":4452,"language":29,"meta":30},[27],"A\nBC\n",[32,4454,4452],{"__ignoreMap":30},[13,4456,4457],{},"甚至一條消息被拆開：",[24,4459,4462],{"className":4460,"code":4461,"language":29,"meta":30},[27],"AB\nC\n",[32,4463,4461],{"__ignoreMap":30},[13,4465,4466],{},"所以真實項目必須設計協議，例如：",[64,4468,4469,4475,4478,4481],{},[67,4470,4471,4472,73],{},"換行符分隔：",[32,4473,4474],{},"cmd_vel 0.1 0.0\\n",[67,4476,4477],{},"固定長度包；",[67,4479,4480],{},"包頭 + 長度 + payload + CRC；",[67,4482,4483],{},"protobuf \u002F flatbuffers 等序列化協議。",[46,4485],{},[49,4487,4488],{"id":4488},"本節總結",[64,4490,4491,4494,4500,4511,4514,4519],{},[67,4492,4493],{},"同步 TCP 適合理解流程，但會阻塞。",[67,4495,4496,4497,4499],{},"異步 TCP 需要 ",[32,4498,3156],{}," 驅動。",[67,4501,4502,4503,4506,4507,4510],{},"服務端通常是 ",[32,4504,4505],{},"async_accept()"," + ",[32,4508,4509],{},"Session"," 類。",[67,4512,4513],{},"每個 TCP 連接對應一個 socket。",[67,4515,4516,4518],{},[32,4517,3163],{}," 常用於保證 session 生命週期。",[67,4520,4521],{},"TCP 沒有消息邊界，真實項目必須設計分幀協議。",[4523,4524,4525],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":30,"searchDepth":111,"depth":111,"links":4527},[4528,4537,4547,4558,4565,4566],{"id":51,"depth":111,"text":4529,"children":4530},"示例 1：普通 main() 裏寫同步 TCP Echo Server",[4531,4532,4533,4534,4535,4536],{"id":59,"depth":119,"text":59},{"id":88,"depth":119,"text":88},{"id":752,"depth":119,"text":752},{"id":825,"depth":119,"text":825},{"id":872,"depth":119,"text":872},{"id":901,"depth":119,"text":901},{"id":952,"depth":111,"text":4538,"children":4539},"示例 2：普通 main() 裏寫同步 TCP Client",[4540,4541,4542,4543,4544,4545],{"id":959,"depth":119,"text":59},{"id":969,"depth":119,"text":88},{"id":1511,"depth":119,"text":752},{"id":1556,"depth":119,"text":825},{"id":1577,"depth":119,"text":872},{"id":1589,"depth":119,"text":4546},"socket.connect() 說明",{"id":1621,"depth":111,"text":1622,"children":4548},[4549,4550,4551,4552,4553,4554,4556],{"id":1625,"depth":119,"text":59},{"id":1651,"depth":119,"text":88},{"id":3015,"depth":119,"text":752},{"id":3074,"depth":119,"text":825},{"id":3128,"depth":119,"text":872},{"id":3160,"depth":119,"text":4555},"shared_from_this() 說明",{"id":3212,"depth":119,"text":4557},"async_read_some() 說明",{"id":3278,"depth":111,"text":3279,"children":4559},[4560,4561,4562,4563,4564],{"id":3282,"depth":119,"text":59},{"id":3301,"depth":119,"text":88},{"id":4281,"depth":119,"text":752},{"id":4325,"depth":119,"text":825},{"id":4345,"depth":119,"text":872},{"id":4426,"depth":111,"text":4427},{"id":4488,"depth":111,"text":4488},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0400-tcp-tong-xin","2100-0100-0400","2023-10-05","wiki\u002F2023-10-05-cplusplus-jiao-xue","zh-hant:2023-10-05-cplusplus-jiao-xue","\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue","Cplusplus教学","md","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0400-TCP通信",false,null,"zh-Hant","zh-hant",{},{"title":5,"description":30},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0400-tcp-tong-xin","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0400-TCP通信","QAHX4fmzAGAu6Wd9niNfIok59ErC1QuYdnNBi8Pzyj0",[4586,4592,4597,4602,4607,4612,4617,4622,4627,4632,4637,4642,4647,4652,4657,4662,4667,4672,4677,4682,4687,4692,4697,4702,4707,4712,4717,4722,4727,4732,4737,4742,4747,4752,4757,4762,4767,4772,4777,4782,4786,4791,4796,4801,4806,4811,4816,4821,4826,4831,4835,4840,4845,4850,4855,4860,4865,4870,4875,4880,4885,4890,4895,4900,4905,4910,4915,4916,4921,4926,4931,4936,4941,4946,4951,4956,4961,4966,4971,4976,4981,4986],{"path":4587,"stem":4588,"title":4589,"date":4569,"chapterOrder":4590,"chapterDepth":4591,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0100-c-kai-fa-huan-jing-da-jian-yu-ce-shi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0100-C++开发环境搭建与测试","C++開發環境搭建與測試","0100",0,{"path":4593,"stem":4594,"title":4595,"date":4569,"chapterOrder":4596,"chapterDepth":4591,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0200-c-ji-chu-chu-shi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0200-C++基础初识","C++基礎初識","0200",{"path":4598,"stem":4599,"title":4600,"date":4569,"chapterOrder":4601,"chapterDepth":4591,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0300-shu-ju-lei-xing-yu-shu-ju-cun-fang","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0300-数据类型与数据存放","數據類型與數據存放","0300",{"path":4603,"stem":4604,"title":4605,"date":4569,"chapterOrder":4606,"chapterDepth":4591,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0400-shu-ru-shu-chu","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0400-输入输出","輸入輸出","0400",{"path":4608,"stem":4609,"title":4610,"date":4569,"chapterOrder":4611,"chapterDepth":4591,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0500-yun-suan-fu","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0500-运算符","運算符","0500",{"path":4613,"stem":4614,"title":4615,"date":4569,"chapterOrder":4616,"chapterDepth":4591,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0600-cheng-xu-liu-cheng-jie-gou","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0600-程序流程结构","程序流程結構","0600",{"path":4618,"stem":4619,"title":4620,"date":4569,"chapterOrder":4621,"chapterDepth":4591,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0700-shu-zu","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0700-数组","數組","0700",{"path":4623,"stem":4624,"title":4625,"date":4569,"chapterOrder":4626,"chapterDepth":4591,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0800-han-shu-yu-tou-wen-jian","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0800-函数与头文件","函數與頭文件","0800",{"path":4628,"stem":4629,"title":4630,"date":4569,"chapterOrder":4631,"chapterDepth":4591,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0900-zhi-zhen","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0900-指针","指針","0900",{"path":4633,"stem":4634,"title":4635,"date":4569,"chapterOrder":4636,"chapterDepth":4591,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1000-jie-gou-ti-yu-gong-yong-ti","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1000-结构体与共用体","結構體與共用體","1000",{"path":4638,"stem":4639,"title":4640,"date":4569,"chapterOrder":4641,"chapterDepth":4591,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1100-nei-cun-fen-qu-yu-sheng-ming-zhou-qi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1100-内存分区与生命周期","內存分區與生命週期","1100",{"path":4643,"stem":4644,"title":4645,"date":4569,"chapterOrder":4646,"chapterDepth":4591,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1200-yin-yong","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1200-引用","引用","1200",{"path":4648,"stem":4649,"title":4650,"date":4569,"chapterOrder":4651,"chapterDepth":4591,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1300-han-shu-ti-gao-yu-ming-ming-kong-jian","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1300-函数提高与命名空间","函數提高與命名空間","1300",{"path":4653,"stem":4654,"title":4655,"date":4569,"chapterOrder":4656,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0100-feng-zhuang","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0100-封装","封裝","1400-0100",{"path":4658,"stem":4659,"title":4660,"date":4569,"chapterOrder":4661,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0200-dui-xiang-chu-shi-hua-he-qing-li","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0200-对象初始化和清理","對象初始化和清理","1400-0200",{"path":4663,"stem":4664,"title":4665,"date":4569,"chapterOrder":4666,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0300-dui-xiang-mo-xing-yu-this-zhi-zhen","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0300-对象模型与this指针","對象模型與this指針","1400-0300",{"path":4668,"stem":4669,"title":4670,"date":4569,"chapterOrder":4671,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0400-you-yuan-yu-yun-suan-fu-zhong-zai","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0400-友元与运算符重载","友元與運算符重載","1400-0400",{"path":4673,"stem":4674,"title":4675,"date":4569,"chapterOrder":4676,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0500-ji-cheng","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0500-继承","繼承","1400-0500",{"path":4678,"stem":4679,"title":4680,"date":4569,"chapterOrder":4681,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0600-duo-tai","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0600-多态","多態","1400-0600",{"path":4683,"stem":4684,"title":4685,"date":4569,"chapterOrder":4686,"chapterDepth":4591,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-lei-he-dui-xiang","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-类和对象","類和對象","1400",{"path":4688,"stem":4689,"title":4690,"date":4569,"chapterOrder":4691,"chapterDepth":4591,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1500-wen-jian-cao-zuo","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1500-文件操作","文件操作","1500",{"path":4693,"stem":4694,"title":4695,"date":4569,"chapterOrder":4696,"chapterDepth":4591,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1600-yi-chang-chu-li-yu-cuo-wu-ma","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1600-异常处理与错误码","異常處理","1600",{"path":4698,"stem":4699,"title":4700,"date":4569,"chapterOrder":4701,"chapterDepth":4591,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1700-mu-ban","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1700-模板","模板","1700",{"path":4703,"stem":4704,"title":4705,"date":4569,"chapterOrder":4706,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0100-stl-chu-shi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0100-STL初识","STL初識","1800-0100",{"path":4708,"stem":4709,"title":4710,"date":4569,"chapterOrder":4711,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0200-std-array","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0200-std-array","std::array","1800-0200",{"path":4713,"stem":4714,"title":4715,"date":4569,"chapterOrder":4716,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0300-string-rong-qi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0300-string容器","string容器","1800-0300",{"path":4718,"stem":4719,"title":4720,"date":4569,"chapterOrder":4721,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0400-vector-rong-qi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0400-vector容器","vector 容器","1800-0400",{"path":4723,"stem":4724,"title":4725,"date":4569,"chapterOrder":4726,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0500-deque-rong-qi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0500-deque容器","deque 容器","1800-0500",{"path":4728,"stem":4729,"title":4730,"date":4569,"chapterOrder":4731,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0600-stack-rong-qi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0600-stack容器","stack 容器","1800-0600",{"path":4733,"stem":4734,"title":4735,"date":4569,"chapterOrder":4736,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0700-queue-rong-qi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0700-queue容器","queue 容器","1800-0700",{"path":4738,"stem":4739,"title":4740,"date":4569,"chapterOrder":4741,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0800-list-rong-qi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0800-list容器","list 容器","1800-0800",{"path":4743,"stem":4744,"title":4745,"date":4569,"chapterOrder":4746,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0900-set-rong-qi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0900-set容器","set \u002F multiset 容器","1800-0900",{"path":4748,"stem":4749,"title":4750,"date":4569,"chapterOrder":4751,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1000-map-rong-qi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-1000-map容器","map \u002F multimap 容器","1800-1000",{"path":4753,"stem":4754,"title":4755,"date":4569,"chapterOrder":4756,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1100-han-shu-dui-xiang-yu-wei-ci","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-1100-函数对象与谓词","函數對象與謂詞","1800-1100",{"path":4758,"stem":4759,"title":4760,"date":4569,"chapterOrder":4761,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1200-chang-yong-suan-fa","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-1200-常用算法","常用算法","1800-1200",{"path":4763,"stem":4764,"title":4765,"date":4569,"chapterOrder":4766,"chapterDepth":4591,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-stl-ti-gao-bian-cheng","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-STL提高编程","STL提高編程","1800",{"path":4768,"stem":4769,"title":4770,"date":4569,"chapterOrder":4771,"chapterDepth":4591,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1900-c-lei-xing-zhuan-huan","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1900-C++类型转换","C++類型轉換","1900",{"path":4773,"stem":4774,"title":4775,"date":4569,"chapterOrder":4776,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0100-auto","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0100-auto","auto","2000-0100",{"path":4778,"stem":4779,"title":4780,"date":4569,"chapterOrder":4781,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0200-nullptr","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0200-nullptr","nullptr","2000-0200",{"path":4783,"stem":4784,"title":153,"date":4569,"chapterOrder":4785,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0300-using","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0300-using","2000-0300",{"path":4787,"stem":4788,"title":4789,"date":4569,"chapterOrder":4790,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0400-enum-class","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0400-enum-class","enum class","2000-0400",{"path":4792,"stem":4793,"title":4794,"date":4569,"chapterOrder":4795,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0500-fan-wei-for-xun-huan","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0500-范围for循环","範圍 for 循環","2000-0500",{"path":4797,"stem":4798,"title":4799,"date":4569,"chapterOrder":4800,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0600-jie-gou-hua-bang-ding","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0600-结构化绑定","結構化綁定","2000-0600",{"path":4802,"stem":4803,"title":4804,"date":4569,"chapterOrder":4805,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0700-constexpr","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0700-constexpr","constexpr","2000-0700",{"path":4807,"stem":4808,"title":4809,"date":4569,"chapterOrder":4810,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0800-raii","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0800-RAII","RAII","2000-0800",{"path":4812,"stem":4813,"title":4814,"date":4569,"chapterOrder":4815,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0900-zhi-neng-zhi-zhen","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0900-智能指针","智能指針","2000-0900",{"path":4817,"stem":4818,"title":4819,"date":4569,"chapterOrder":4820,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1000-you-zhi-yin-yong-he-yi-dong-yu-yi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1000-右值引用和移动语义","右值引用和移動語義","2000-1000",{"path":4822,"stem":4823,"title":4824,"date":4569,"chapterOrder":4825,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1100-lambda-biao-da-shi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1100-Lambda表达式","Lambda 表達式","2000-1100",{"path":4827,"stem":4828,"title":4829,"date":4569,"chapterOrder":4830,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1200-std-function","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1200-std-function","std::function","2000-1200",{"path":4832,"stem":4833,"title":43,"date":4569,"chapterOrder":4834,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1300-std-bind","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1300-std-bind","2000-1300",{"path":4836,"stem":4837,"title":4838,"date":4569,"chapterOrder":4839,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1400-std-optional","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1400-std-optional","std::optional","2000-1400",{"path":4841,"stem":4842,"title":4843,"date":4569,"chapterOrder":4844,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1500-std-variant","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1500-std-variant","std::variant","2000-1500",{"path":4846,"stem":4847,"title":4848,"date":4569,"chapterOrder":4849,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1600-std-span","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1600-std-span","std::span","2000-1600",{"path":4851,"stem":4852,"title":4853,"date":4569,"chapterOrder":4854,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1700-std-format-print","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1700-std-format-print","std::format \u002F std::print","2000-1700",{"path":4856,"stem":4857,"title":4858,"date":4569,"chapterOrder":4859,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1800-std-chrono","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1800-std-chrono","std::chrono","2000-1800",{"path":4861,"stem":4862,"title":4863,"date":4569,"chapterOrder":4864,"chapterDepth":111,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0100-std-thread","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0100-std-thread","std::thread 與 join","2000-1900-0100",{"path":4866,"stem":4867,"title":4868,"date":4569,"chapterOrder":4869,"chapterDepth":111,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0200-mutex-lock-guard","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0200-mutex-lock-guard","mutex 與 lock_guard","2000-1900-0200",{"path":4871,"stem":4872,"title":4873,"date":4569,"chapterOrder":4874,"chapterDepth":111,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0300-std-atomic","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0300-std-atomic","std::atomic","2000-1900-0300",{"path":4876,"stem":4877,"title":4878,"date":4569,"chapterOrder":4879,"chapterDepth":111,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0400-condition-variable","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0400-condition-variable","condition_variable","2000-1900-0400",{"path":4881,"stem":4882,"title":4883,"date":4569,"chapterOrder":4884,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-bing-fa-bian-cheng","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-并发编程","併發編程","2000-1900",{"path":4886,"stem":4887,"title":4888,"date":4569,"chapterOrder":4889,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-2000-std-filesystem","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-2000-std-filesystem","std::filesystem","2000-2000",{"path":4891,"stem":4892,"title":4893,"date":4569,"chapterOrder":4894,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-2100-modules-jian-jie","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-2100-modules简介","modules 簡介","2000-2100",{"path":4896,"stem":4897,"title":4898,"date":4569,"chapterOrder":4899,"chapterDepth":4591,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-xian-dai-c","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-现代C++","現代C++","2000",{"path":4901,"stem":4902,"title":4903,"date":4569,"chapterOrder":4904,"chapterDepth":111,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0100-ding-shi-qi-yu-yi-bu-io","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0100-定时器与异步IO","定時器與異步 IO","2100-0100-0100",{"path":4906,"stem":4907,"title":4908,"date":4569,"chapterOrder":4909,"chapterDepth":111,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0200-boost-asio-ji-chu","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0200-Boost.Asio基础","Boost.Asio 基礎","2100-0100-0200",{"path":4911,"stem":4912,"title":4913,"date":4569,"chapterOrder":4914,"chapterDepth":111,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0300-chuan-kou-tong-xin","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0300-串口通信","串口通信","2100-0100-0300",{"path":4567,"stem":4583,"title":5,"date":4569,"chapterOrder":4568,"chapterDepth":111,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},{"path":4917,"stem":4918,"title":4919,"date":4569,"chapterOrder":4920,"chapterDepth":111,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0500-udp-tong-xin","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0500-UDP通信","UDP 通信","2100-0100-0500",{"path":4922,"stem":4923,"title":4924,"date":4569,"chapterOrder":4925,"chapterDepth":111,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0600-ji-qi-ren-gong-cheng-xie-fa-yu-ros2-ji-cheng","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0600-机器人工程写法与ROS2集成","機器人工程寫法與 ROS2 集成","2100-0100-0600",{"path":4927,"stem":4928,"title":4929,"date":4569,"chapterOrder":4930,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-boost-asio-yi-bu-io-ku","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-Boost.Asio异步IO库","Boost.Asio異步IO庫","2100-0100",{"path":4932,"stem":4933,"title":4934,"date":4569,"chapterOrder":4935,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0200-eigen-xian-xing-dai-shu-ku","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0200-Eigen线性代数库","Eigen線性代數庫","2100-0200",{"path":4937,"stem":4938,"title":4939,"date":4569,"chapterOrder":4940,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0300-opencv-ji-suan-ji-shi-jue-ku","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0300-OpenCV计算机视觉库","OpenCV計算機視覺庫","2100-0300",{"path":4942,"stem":4943,"title":4944,"date":4569,"chapterOrder":4945,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0400-pcl-dian-yun-ku","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0400-PCL点云库","PCL點雲庫","2100-0400",{"path":4947,"stem":4948,"title":4949,"date":4569,"chapterOrder":4950,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0500-sophus-li-qun-li-dai-shu-ku","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0500-Sophus李群李代数库","Sophus 李羣李代數庫","2100-0500",{"path":4952,"stem":4953,"title":4954,"date":4569,"chapterOrder":4955,"chapterDepth":4591,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-chang-yong-ku","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-常用库","常用庫學習","2100",{"path":4957,"stem":4958,"title":4959,"date":4569,"chapterOrder":4960,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0100-cmakepresets-yu-gou-jian-an-zhuang","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0100-CMakePresets与构建安装","CMakePresets與構建安裝","2200-0100",{"path":4962,"stem":4963,"title":4964,"date":4569,"chapterOrder":4965,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0200-ding-ceng-cmake-yu-gong-gong-bian-yi-xuan-xiang","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0200-顶层CMake与公共编译选项","頂層CMake與公共編譯選項","2200-0200",{"path":4967,"stem":4968,"title":4969,"date":4569,"chapterOrder":4970,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0300-src-yu-lib-mo-kuai-cmake-xiang-jie","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0300-src与lib模块CMake详解","src與lib模塊CMake詳解","2200-0300",{"path":4972,"stem":4973,"title":4974,"date":4569,"chapterOrder":4975,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0400-di-san-fang-ku-yi-lai-xie-fa","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0400-第三方库依赖写法","第三方庫依賴寫法","2200-0400",{"path":4977,"stem":4978,"title":4979,"date":4569,"chapterOrder":4980,"chapterDepth":100,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0500-mu-ban-kuo-zhan-yu-chang-jian-wen-ti","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0500-模板扩展与常见问题","模板擴展與常見問題","2200-0500",{"path":4982,"stem":4983,"title":4984,"date":4569,"chapterOrder":4985,"chapterDepth":4591,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":4576},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-cmake-gong-cheng-mu-ban","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-CMake工程模板","CMake工程模板","2200",{"path":4572,"stem":4987,"title":4988,"date":4569,"chapterOrder":4577,"chapterDepth":4591,"docKey":4571,"docRoot":4572,"docTitle":4573,"isWikiDoc":146,"isWikiIndex":146},"_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002Findex","C\u002FC++教程",{"variants":4990},[4991,4994,4995,4998,5001],{"path":4992,"localeSlug":4993,"i18nKey":4575},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0400-tcp-tong-xin","en-us",{"path":4567,"localeSlug":4579,"i18nKey":4575},{"path":4996,"localeSlug":4997,"i18nKey":4575},"\u002Fzh-hk\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0400-tcp-tong-xin","zh-hk",{"path":4999,"localeSlug":5000,"i18nKey":4575},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0400-tcp-tong-xin","zh-tw",{"path":5002,"localeSlug":5003,"i18nKey":4575},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0400-tcp-tong-xin","zh-cn",[4992,4582,4567,4582,4996,4582,4999,4582,5002,4582],1784646816293]