An Overlay-based
Virtual Network Substrate
SpoVNet

source: sample/AribaTunnel/Udp.cpp @ 12457

Last change on this file since 12457 was 12457, checked in by hock@…, 9 years ago

added AribaTunnel? to the repo

File size: 2.3 KB
Line 
1#include "Udp.h"
2
3using namespace std;
4
5udp_server::~udp_server()
6{
7}
8
9void udp_server::listen_on(uint16_t port)
10{
11    std::cout << "[UDP] listening on port: " << port << std::endl;
12   
13    socket_.open(udp::v4());
14    socket_.bind(udp::endpoint(udp::v4(), port));
15    start_receive();
16}
17
18void udp_server::connect_to(uint16_t port)
19{
20    std::cout << "[UDP] connecting to port: " << port << " (on localhost)" << std::endl;
21
22    remote_endpoint_ = udp::endpoint(boost::asio::ip::address::from_string("127.0.0.1"), port);
23   
24    socket_.open(udp::v4());
25    socket_.connect(remote_endpoint_);
26    start_receive();
27}
28
29
30/* MessageSenderInterface */
31void udp_server::SendMessage(reboost::shared_buffer_t msg)
32{
33    cout << "[UDP] sending " << msg.size() << " bytes to " << remote_endpoint_ << endl;
34   
35    // send over udp
36    socket_.async_send_to(
37        boost::asio::buffer(msg.data(), msg.size()),
38        remote_endpoint_,
39        boost::bind(&udp_server::handle_send, this, msg,
40            boost::asio::placeholders::error,
41            boost::asio::placeholders::bytes_transferred));
42}
43void udp_server::SendMessage(reboost::message_t msg)
44{
45    reboost::shared_buffer_t buf = msg.linearize();
46    this->SendMessage(buf);
47}
48
49
50
51/* asio udp */
52void udp_server::start_receive()
53{
54    recv_buffer_ = reboost::shared_buffer_t(3000);
55   
56    socket_.async_receive_from(
57        boost::asio::buffer(recv_buffer_.mutable_data(), recv_buffer_.size()),
58        remote_endpoint_,
59        boost::bind(&udp_server::handle_receive, this,
60        boost::asio::placeholders::error,
61        boost::asio::placeholders::bytes_transferred));
62}
63
64void udp_server::handle_receive(const boost::system::error_code& error, std::size_t bytes_transferred)
65{
66    if (!error || error == boost::asio::error::message_size)
67    {
68        cout << "[UDP] received " << bytes_transferred << " bytes from " << remote_endpoint_ << endl;
69
70        // send sub-buffer trough tunnel
71        send_via_ariba( recv_buffer_(0, bytes_transferred) );
72
73        // wait for further messages...
74        start_receive();
75    }
76}
77
78void udp_server::handle_send(reboost::shared_buffer_t msg, const boost::system::error_code& , std::size_t )
79{
80    // empty
81}
82
83
84/// forward data over ariba
85void udp_server::send_via_ariba(reboost::shared_buffer_t buffer)
86{
87    tunnel.SendMessage(buffer);
88}
Note: See TracBrowser for help on using the repository browser.