Subversion Repositories HomeAutomation

Rev

Go to most recent revision | Blame | Last modification | View Log | SVN | RSS feed

  1. /*
  2.  * UdpConnection.h
  3.  *
  4.  *  Created on: Jul 17, 2009
  5.  *      Author: Mattias Runge
  6.  */
  7.  
  8. #ifndef UDPCONNECTION_H_
  9. #define UDPCONNECTION_H_
  10.  
  11. #include <string>
  12. #include "BitBuffer.h"
  13. #include "Logger.h"
  14. #include <boost/array.hpp>
  15. #include <boost/asio.hpp>
  16. #include "../utils/Thread.h"
  17. #include <boost/signal.hpp>
  18.  
  19. namespace atom {
  20. namespace utils {
  21.  
  22. using boost::asio::ip::udp;
  23. using namespace std;
  24.  
  25. class UdpServer
  26. {
  27. public:
  28.     UdpConnection(unsigned int port)
  29.     : socket(this->ioService, udp::endpoint(udp::v4(), port))
  30.     {
  31.         this->socket.async_receive_from(
  32.                 boost::asio::buffer(data_, max_length), sender_endpoint_,
  33.                 boost::bind(&server::handle_receive_from, this,
  34.                         boost::asio::placeholders::error,
  35.                         boost::asio::placeholders::bytes_transferred));
  36.  
  37.     }
  38.  
  39. private:
  40.  
  41.     void
  42.     handleReceive(const boost::system::error_code& error, std::size_t /*bytes_transferred*/)
  43.     {
  44.         if (!error || error == boost::asio::error::message_size)
  45.         {
  46.             boost::shared_ptr<std::string>
  47.                     message(new std::string(make_daytime_string()));
  48.  
  49.             socket_.async_send_to(boost::asio::buffer(*message), remote_endpoint_, boost::bind(&udp_server::handle_send, this, message, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
  50.  
  51.             start_receive();
  52.         }
  53.     }
  54.  
  55.     void
  56.     handle_send(boost::shared_ptr<std::string> /*message*/, const boost::system::error_code& /*error*/, std::size_t /*bytes_transferred*/)
  57.     {
  58.     }
  59.  
  60.     udp::socket socket;
  61.     udp::endpoint remoteEndpoint;
  62.     boost::array<char, 1> receiveBuffer;
  63.  
  64.     io_service ioService;
  65. };
  66.  
  67. class UdpConnection
  68. {
  69.     typedef boost::signal<void
  70.     (BitBuffer &buffer)> OnIncommingSignal;
  71.  
  72. public:
  73.     UdpConnection(string ip, unsigned int port);
  74.     virtual
  75.     ~UdpConnection();
  76.  
  77.     void
  78.     connect();
  79.     void
  80.     disconnect();
  81.     void
  82.     write(BitBuffer buffer);
  83.  
  84. protected:
  85.     string _ip;
  86.     unsigned int _port;
  87.     udp::socket *_outSocket;
  88.     udp::socket *_inSocket;
  89.     udp::endpoint _receiverEndpoint;
  90.  
  91. private:
  92.     Logger LOG;
  93. };
  94.  
  95. }
  96. }
  97.  
  98. #endif /* UDPCONNECTION_H_ */
  99.