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 }