Changeset 4853 for source/ariba


Ignore:
Timestamp:
Jul 10, 2009, 3:16:49 PM (15 years ago)
Author:
Christoph Mayer
Message:

erste version für periodic broadcasting für ipv6 und ipv6

Location:
source/ariba/utility/bootstrap/modules/periodicbroadcast
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • source/ariba/utility/bootstrap/modules/periodicbroadcast/PeriodicBroadcast.cpp

    r4851 r4853  
    5353
    5454#include "PeriodicBroadcast.h"
    55 #include "PeriodicBroadcastMessage.h"
    5655
    5756namespace ariba {
     
    6059use_logging_cpp(PeriodicBroadcast);
    6160const long PeriodicBroadcast::timerinterval = 1000;
     61const unsigned int PeriodicBroadcast::serverport_v4 = 5634;
     62const unsigned int PeriodicBroadcast::serverport_v6 = 5636;
    6263
    63 PeriodicBroadcast::PeriodicBroadcast(BootstrapInformationCallback* _callback) : BootstrapModule(_callback) {
     64PeriodicBroadcast::PeriodicBroadcast(BootstrapInformationCallback* _callback)
     65        : BootstrapModule(_callback),
     66        server(io_service, &newRemoteServices, &newRemoteServicesMutex) {
    6467}
    6568
     
    121124        ServiceList::iterator iend = localServices.end();
    122125
    123         for( ; i != iend; i++){
    124 
    125                 PeriodicBroadcastMessage msg( i->second.name, i->second.info1, i->second.info2, i->second.info3 );
    126                 Data data = data_serialize( msg, DEFAULT_V );
    127                 uint8_t* pnt = data.getBuffer();
    128                 size_t len = data.getLength();
    129 
    130 
    131                 // TODO: ÃŒber socket rauspusten
    132 
    133         }
     126        for( ; i != iend; i++)
     127                server.sendservice( i->second );
    134128}
    135129
  • source/ariba/utility/bootstrap/modules/periodicbroadcast/PeriodicBroadcast.h

    r4851 r4853  
    4545#include <string>
    4646#include <iostream>
     47#include <boost/asio.hpp>
    4748#include <boost/foreach.hpp>
    4849#include <boost/thread/mutex.hpp>
     
    5152#include "ariba/utility/logging/Logging.h"
    5253#include "ariba/utility/system/Timer.h"
     54#include "PeriodicBroadcastMessage.h"
    5355
    5456using std::map;
    5557using std::string;
     58using boost::asio::ip::udp;
    5659
    5760namespace ariba {
     
    8184
    8285        static const long timerinterval;
     86        static const unsigned int serverport_v4;
     87        static const unsigned int serverport_v6;
    8388
    8489        typedef struct _Service {
     
    9398        boost::mutex localServicesMutex;
    9499
     100        ServiceList remoteServices;
     101        boost::mutex remoteServicesMutex;
     102
     103        ServiceList newRemoteServices;
     104        boost::mutex newRemoteServicesMutex;
     105
     106        boost::asio::io_service io_service;
     107
     108        class udp_server {
     109        private:
     110                udp::socket socket_v4;
     111                udp::socket socket_v6;
     112                udp::endpoint remote_endpoint_;
     113                boost::array<char, 1500> recv_buffer_;
     114                ServiceList* services;
     115                boost::mutex* servicesmutex;
     116
     117        public:
     118                udp_server(boost::asio::io_service& io_service, ServiceList* _services, boost::mutex* _servicesmutex)
     119                        : socket_v4(io_service, udp::endpoint(udp::v4(), PeriodicBroadcast::serverport_v4)),
     120                          socket_v6(io_service, udp::endpoint(udp::v6(), PeriodicBroadcast::serverport_v6)),
     121                          services(_services), servicesmutex(_servicesmutex) {
     122
     123                        boost::asio::socket_base::broadcast option(true);
     124                        socket_v4.set_option(option);
     125                        socket_v6.set_option(option);
     126
     127                        start_receive();
     128                }
     129
     130                void sendservice(Service service){
     131
     132                        PeriodicBroadcastMessage msg( service.name, service.info1, service.info2, service.info3 );
     133                        Data data = data_serialize( msg, DEFAULT_V );
     134                        uint8_t* pnt = data.getBuffer();
     135                        size_t len = data.getLength();
     136                        boost::system::error_code ignored_error;
     137
     138                        {
     139                                udp::endpoint endp(udp::v4(), PeriodicBroadcast::serverport_v4);
     140                                endp.address( boost::asio::ip::address_v4::broadcast() );
     141                                socket_v4.send_to( boost::asio::buffer(pnt, len), endp, 0, ignored_error );
     142                        }
     143                        {
     144                                udp::endpoint endp(udp::v6(), PeriodicBroadcast::serverport_v6);
     145                                endp.address( boost::asio::ip::address_v6::from_string("ff02::1") );
     146                                socket_v6.send_to( boost::asio::buffer(pnt, len), endp, 0, ignored_error );
     147                        }
     148                }
     149
     150        private:
     151                void start_receive(){
     152                        socket_v4.async_receive_from(
     153                                        boost::asio::buffer(recv_buffer_), remote_endpoint_,
     154                                        boost::bind(&udp_server::handle_receive, this,
     155                                                        boost::asio::placeholders::error,
     156                                                        boost::asio::placeholders::bytes_transferred));
     157
     158                        socket_v6.async_receive_from(
     159                                        boost::asio::buffer(recv_buffer_), remote_endpoint_,
     160                                        boost::bind(&udp_server::handle_receive, this,
     161                                                        boost::asio::placeholders::error,
     162                                                        boost::asio::placeholders::bytes_transferred));
     163                }
     164
     165                void handle_receive(const boost::system::error_code& error,
     166                                std::size_t bytes_transferred){
     167
     168                        if (!error || error == boost::asio::error::message_size){
     169
     170                                PeriodicBroadcastMessage msg;
     171                                Data data( (uint8_t*)recv_buffer_.data(), bytes_transferred*8 );
     172                                data_deserialize( msg, data );
     173
     174                                { // insert new found service
     175                                        boost::mutex::scoped_lock( *servicesmutex );
     176
     177                                        ServiceList::iterator it = services->find( msg.getName() );
     178                                        if( it != services->end() ) services->erase( it );
     179
     180                                        Service s;
     181                                        s.info1 = msg.getInfo1();
     182                                        s.info2 = msg.getInfo2();
     183                                        s.info3 = msg.getInfo3();
     184                                        services->insert( std::make_pair(msg.getName(), s) );
     185                                }
     186
     187                                start_receive();
     188                        }
     189                }
     190
     191                void handle_send(boost::shared_ptr<std::string> /*message*/,
     192                                const boost::system::error_code& /*error*/,
     193                                std::size_t /*bytes_transferred*/){
     194                }
     195
     196        };
     197
     198        udp_server server;
     199
    95200};
    96201
Note: See TracChangeset for help on using the changeset viewer.