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