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