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