src/​examples/​cpp03/​echo/​async_udp_echo_server​.​cppsrc/​examples/​cpp11/​echo/​async_udp_echo_server​.​cpp
⋮⋮
1 /​/​1 /​/​
2 /​/​·​async_udp_echo_server​.​cpp2 /​/​·​async_udp_echo_server​.​cpp
3 /​/​·​~~~~~~~~~~~~~~~~~~~~~​~~~~3 /​/​·​~~~~~~~~~~~~~~~~~~~~~​~~~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2013·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2013·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #include·​<cstdlib>11 #include·​<cstdlib>
12 #include·​<iostream>12 #include·​<iostream>
13 #include·​<boost/​bind.​hpp>
14 #include·​"asio.​hpp"13 #include·​"asio.​hpp"
15 14
16 using·​asio:​:​ip:​:​udp;​15 using·​asio:​:​ip:​:​udp;​
17 16
18 class·​server17 class·​server
19 {18 {
20 public:​19 public:​
21 ·​·​server(asio:​:​io_service&·​io_service,​·​short·​port)​20 ·​·​server(asio:​:​io_service&·​io_service,​·​short·​port)​
22 ·​·​·​·​:​·​io_service_(io_servic​e)​,​21 ·​·​·​·​:​·​socket_(io_service,​·​udp:​:​endpoint(udp:​:​v4()​,​·​port)​)​
23 ·​·​·​·​·​·​socket_(io_service,​·​udp:​:​endpoint(udp:​:​v4()​,​·​port)​)​
24 ·​·​{22 ·​·​{
25 ·​·​·​·​socket_.​async_receive_from(23 ·​·​·​·​do_receive()​;​
26 ·​·​·​·​·​·​·​·​asio:​:​buffer(data_,​·​max_length)​,​·​sender_endpoint_,​
27 ·​·​·​·​·​·​·​·​boost:​:​bind(&server:​:​handle_receive_from,​·​this,​
28 ·​·​·​·​·​·​·​·​·​·​asio:​:​placeholders:​:​error,​
29 ·​·​·​·​·​·​·​·​·​·​asio:​:​placeholders:​:​bytes_transferred)​)​;​
30 ·​·​}24 ·​·​}
31 25
32 ·​·​void·​handle_receive_from(c​onst·​asio:​:​error_code&·​error,​26 ·​·​void·​do_receive()​
33 ·​·​·​·​·​·​size_t·​bytes_recvd)​
34 ·​·​{27 ·​·​{
35 ·​·​·​·​if·​(!error·​&&·​bytes_recvd·​>·​0)​28 ·​·​·​·​socket_.​async_receive_from(
36 ·​·​·​·​{29 ·​·​·​·​·​·​·​·​asio:​:​buffer(data_,​·​max_length)​,​·​sender_endpoint_,​
37 ·​·​·​·​·​·​socket_.​async_send_to(30 ·​·​·​·​·​·​·​·​[this](std:​:​error_code·​ec,​·​std:​:​size_t·​bytes_recvd)​
38 ·​·​·​·​·​·​·​·​·​·​asio:​:​buffer(data_,​·​bytes_recvd)​,​·​sender_endpoint_,​31 ·​·​·​·​·​·​·​·​{
39 ·​·​·​·​·​·​·​·​·​·​boost:​:​bind(&server:​:​handle_send_to,​·​this,​32 ·​·​·​·​·​·​·​·​·​·​if·​(!ec·​&&·​bytes_recvd·​>·​0)​
40 ·​·​·​·​·​·​·​·​·​·​·​·​asio:​:​placeholders:​:​error,​33 ·​·​·​·​·​·​·​·​·​·​{
41 ·​·​·​·​·​·​·​·​·​·​·​·​asio:​:​placeholders:​:​bytes_transferred)​)​;​34 ·​·​·​·​·​·​·​·​·​·​·​·​do_send(bytes_recvd)​;​
42 ·​·​·​·​}35 ·​·​·​·​·​·​·​·​·​·​}
43 ·​·​·​·​else36 ·​·​·​·​·​·​·​·​·​·​else
44 ·​·​·​·​{37 ·​·​·​·​·​·​·​·​·​·​{
45 ·​·​·​·​·​·​socket_.​async_receive_from(38 ·​·​·​·​·​·​·​·​·​·​·​·​do_receive()​;​
46 ·​·​·​·​·​·​·​·​·​·​asio:​:​buffer(data_,​·​max_length)​,​·​sender_endpoint_,​39 ·​·​·​·​·​·​·​·​·​·​}
47 ·​·​·​·​·​·​·​·​·​·​boost:​:​bind(&server:​:​handle_receive_from,​·​this,​40 ·​·​·​·​·​·​·​·​})​;​
48 ·​·​·​·​·​·​·​·​·​·​·​·​asio:​:​placeholders:​:​error,​
49 ·​·​·​·​·​·​·​·​·​·​·​·​asio:​:​placeholders:​:​bytes_transferred)​)​;​
50 ·​·​·​·​}
51 ·​·​}41 ·​·​}
52 42
53 ·​·​void·​handle_send_to(const·​asio:​:​error_code&·​/​*error*/​,​43 ·​·​void·​do_send(std:​:​size_t·​length)​
54 ·​·​·​·​·​·​size_t·​/​*bytes_sent*/​)​
55 ·​·​{44 ·​·​{
56 ·​·​·​·​socket_.​async_receive_from(45 ·​·​·​·​socket_.​async_send_to(
57 ·​·​·​·​·​·​·​·​asio:​:​buffer(data_,​·​max_length)​,​·​sender_endpoint_,​46 ·​·​·​·​·​·​·​·​asio:​:​buffer(data_,​·​length)​,​·​sender_endpoint_,​
58 ·​·​·​·​·​·​·​·​boost:​:​bind(&server:​:​handle_receive_from,​·​this,​47 ·​·​·​·​·​·​·​·​[this](std:​:​error_code·​/​*ec*/​,​·​std:​:​size_t·​/​*bytes_sent*/​)​
59 ·​·​·​·​·​·​·​·​·​·​asio:​:​placeholders:​:​error,​48 ·​·​·​·​·​·​·​·​{
60 ·​·​·​·​·​·​·​·​·​·​asio:​:​placeholders:​:​bytes_transferred)​)​;​49 ·​·​·​·​·​·​·​·​·​·​do_receive()​;​
50 ·​·​·​·​·​·​·​·​})​;​
61 ·​·​}51 ·​·​}
62 52
63 private:​53 private:​
64 ·​·​asio:​:​io_service&·​io_service_;​
65 ·​·​udp:​:​socket·​socket_;​54 ·​·​udp:​:​socket·​socket_;​
66 ·​·​udp:​:​endpoint·​sender_endpoint_;​55 ·​·​udp:​:​endpoint·​sender_endpoint_;​
67 ·​·​enum·​{·​max_length·​=·​1024·​};​56 ·​·​enum·​{·​max_length·​=·​1024·​};​
68 ·​·​char·​data_[max_length];​57 ·​·​char·​data_[max_length];​
69 };​58 };​
70 59
71 int·​main(int·​argc,​·​char*·​argv[])​60 int·​main(int·​argc,​·​char*·​argv[])​
72 {61 {
73 ·​·​try62 ·​·​try
74 ·​·​{63 ·​·​{
75 ·​·​·​·​if·​(argc·​!=·​2)​64 ·​·​·​·​if·​(argc·​!=·​2)​
76 ·​·​·​·​{65 ·​·​·​·​{
77 ·​·​·​·​·​·​std:​:​cerr·​<<·​"Usage:​·​async_udp_echo_server​·​<port>\n";​66 ·​·​·​·​·​·​std:​:​cerr·​<<·​"Usage:​·​async_udp_echo_server​·​<port>\n";​
78 ·​·​·​·​·​·​return·​1;​67 ·​·​·​·​·​·​return·​1;​
79 ·​·​·​·​}68 ·​·​·​·​}
80 69
81 ·​·​·​·​asio:​:​io_service·​io_service;​70 ·​·​·​·​asio:​:​io_service·​io_service;​
82 71
83 ·​·​·​·​using·​namespace·​std;​·​/​/​·​For·​atoi.​72 ·​·​·​·​server·​s(io_service,​·​std:​:​atoi(argv[1])​)​;​
84 ·​·​·​·​server·​s(io_service,​·​atoi(argv[1])​)​;​
85 73
86 ·​·​·​·​io_service.​run()​;​74 ·​·​·​·​io_service.​run()​;​
87 ·​·​}75 ·​·​}
88 ·​·​catch·​(std:​:​exception&·​e)​76 ·​·​catch·​(std:​:​exception&·​e)​
89 ·​·​{77 ·​·​{
90 ·​·​·​·​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​78 ·​·​·​·​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​
91 ·​·​}79 ·​·​}
92 80
93 ·​·​return·​0;​81 ·​·​return·​0;​
94 }82 }