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