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