1 | // asio_error.cpp : Defines the entry point for the console application.
|
---|
2 | //
|
---|
3 |
|
---|
4 | #include "stdafx.h"
|
---|
5 | #include "boost/bind.hpp"
|
---|
6 | #include "boost/asio.hpp"
|
---|
7 |
|
---|
8 | class UDPServer
|
---|
9 | {
|
---|
10 | public:
|
---|
11 | UDPServer()
|
---|
12 | :m_socket(m_io_service),
|
---|
13 | m_timer(m_io_service)
|
---|
14 | {
|
---|
15 | }
|
---|
16 |
|
---|
17 | virtual ~UDPServer()
|
---|
18 | {
|
---|
19 |
|
---|
20 | }
|
---|
21 |
|
---|
22 | void Initialize(const std::string& strIP, int nPort)
|
---|
23 | {
|
---|
24 | boost::system::error_code ec;
|
---|
25 | boost::asio::ip::address ad = boost::asio::ip::address::from_string(strIP, ec);
|
---|
26 | boost::asio::ip::udp::endpoint ep(ad, nPort);
|
---|
27 | m_socket.open(ep.protocol());
|
---|
28 | m_socket.bind(ep, ec);
|
---|
29 | {
|
---|
30 | // TEST CODE:
|
---|
31 | boost::asio::ip::udp::endpoint ep(boost::asio::ip::address::from_string("172.18.8.111", ec), 8001);
|
---|
32 | m_vServerGroup.push_back(ep);
|
---|
33 | }
|
---|
34 | }
|
---|
35 |
|
---|
36 | void Start()
|
---|
37 | {
|
---|
38 | StartAsyncReceiveFrom();
|
---|
39 | NoticeSelfUp();
|
---|
40 | while (true)
|
---|
41 | {
|
---|
42 | boost::system::error_code ec;
|
---|
43 | m_io_service.poll(ec);
|
---|
44 | }
|
---|
45 | }
|
---|
46 |
|
---|
47 | void SendUDPMsg(const char* pMsg, int nLen, boost::asio::ip::udp::endpoint& dest_ep)
|
---|
48 | {
|
---|
49 | m_socket.async_send_to(
|
---|
50 | boost::asio::buffer(pMsg, nLen),
|
---|
51 | dest_ep,
|
---|
52 | boost::bind(&UDPServer::HandleSendTo, this, _1, _2, boost::ref(dest_ep)));
|
---|
53 | }
|
---|
54 |
|
---|
55 | protected:
|
---|
56 | void NoticeSelfUp()
|
---|
57 | {
|
---|
58 | size_t count = m_vServerGroup.size();
|
---|
59 | char* pBuff = "this is up";
|
---|
60 | for (size_t i = 0; i < count; ++i)
|
---|
61 | {
|
---|
62 | SendUDPMsg(pBuff, strlen(pBuff), m_vServerGroup[i]);
|
---|
63 | }
|
---|
64 | m_timer.expires_from_now(boost::posix_time::seconds(5));
|
---|
65 | m_timer.async_wait(boost::bind(&UDPServer::NoticeSelfUp, this));
|
---|
66 | }
|
---|
67 |
|
---|
68 | void HandleReceiveFrom(const boost::system::error_code& ec, size_t bytes_recvd)
|
---|
69 | {
|
---|
70 | if (ec)
|
---|
71 | {
|
---|
72 | std::cout<<"HandleReceiveFrom error: \t"<<ec<<std::endl;
|
---|
73 | }
|
---|
74 | else
|
---|
75 | {
|
---|
76 | // TODO
|
---|
77 | }
|
---|
78 | StartAsyncReceiveFrom();
|
---|
79 | }
|
---|
80 |
|
---|
81 | void HandleSendTo(const boost::system::error_code& ec, size_t bytes_sent, boost::asio::ip::udp::endpoint& ep)
|
---|
82 | {
|
---|
83 | if (ec)
|
---|
84 | {
|
---|
85 | std::cout<<"HandleReceiveFrom error: \t"<<ec<<"\t"<<ep<<std::endl;
|
---|
86 | }
|
---|
87 | else
|
---|
88 | {
|
---|
89 | // TODO
|
---|
90 | }
|
---|
91 | }
|
---|
92 |
|
---|
93 | void StartAsyncReceiveFrom()
|
---|
94 | {
|
---|
95 | m_socket.async_receive_from(boost::asio::buffer(m_buff, max_length),
|
---|
96 | m_sender_point,
|
---|
97 | boost::bind(&UDPServer::HandleReceiveFrom, this, _1, _2));
|
---|
98 | }
|
---|
99 |
|
---|
100 | private:
|
---|
101 | boost::asio::io_service m_io_service;
|
---|
102 | boost::asio::ip::udp::socket m_socket;
|
---|
103 | boost::asio::ip::udp::endpoint m_sender_point;
|
---|
104 | boost::asio::deadline_timer m_timer;
|
---|
105 | std::vector<boost::asio::ip::udp::endpoint> m_vServerGroup;
|
---|
106 | enum { max_length = 1024 };
|
---|
107 | char m_buff[max_length];
|
---|
108 | };
|
---|
109 |
|
---|
110 | int _tmain(int argc, _TCHAR* argv[])
|
---|
111 | {
|
---|
112 | UDPServer server;
|
---|
113 | server.Initialize("172.18.8.111", 8000);
|
---|
114 | server.Start();
|
---|
115 | return 0;
|
---|
116 | }
|
---|
117 |
|
---|