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