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