MulticastDataLink.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008 #ifndef DCPS_MULTICASTDATALINK_H
00009 #define DCPS_MULTICASTDATALINK_H
00010
00011 #include "Multicast_Export.h"
00012
00013 #include "MulticastInst.h"
00014 #include "MulticastSendStrategy.h"
00015 #include "MulticastSendStrategy_rch.h"
00016 #include "MulticastReceiveStrategy.h"
00017 #include "MulticastReceiveStrategy_rch.h"
00018 #include "MulticastSession_rch.h"
00019 #include "MulticastSessionFactory.h"
00020 #include "MulticastSessionFactory_rch.h"
00021 #include "MulticastTransport.h"
00022 #include "MulticastTypes.h"
00023
00024 #include "dds/DCPS/DisjointSequence.h"
00025 #include "dds/DCPS/PoolAllocator.h"
00026
00027 #include "dds/DCPS/transport/framework/DataLink.h"
00028 #include "dds/DCPS/transport/framework/TransportReactorTask.h"
00029 #include "dds/DCPS/transport/framework/TransportSendBuffer.h"
00030
00031 #include "ace/SOCK_Dgram_Mcast.h"
00032 #include "ace/Synch_Traits.h"
00033
00034 OPENDDS_BEGIN_VERSIONED_NAMESPACE_DECL
00035
00036 namespace OpenDDS {
00037 namespace DCPS {
00038
00039 class MulticastTransport;
00040 typedef RcHandle<MulticastTransport> MulticastTransport_rch;
00041
00042 class OpenDDS_Multicast_Export MulticastDataLink
00043 : public DataLink {
00044 public:
00045 MulticastDataLink(MulticastTransport& transport,
00046 const MulticastSessionFactory_rch& session_factory,
00047 MulticastPeer local_peer,
00048 MulticastInst& config,
00049 TransportReactorTask* reactor_task,
00050 bool is_active);
00051 virtual ~MulticastDataLink();
00052
00053 MulticastTransport& transport();
00054
00055 MulticastPeer local_peer() const;
00056
00057 MulticastSendStrategy* send_strategy();
00058
00059 MulticastReceiveStrategy* receive_strategy();
00060
00061 SingleSendBuffer* send_buffer();
00062
00063 MulticastInst& config();
00064
00065 TransportReactorTask* reactor_task();
00066 ACE_Reactor* get_reactor();
00067 ACE_Proactor* get_proactor();
00068
00069 ACE_SOCK_Dgram_Mcast& socket();
00070
00071 bool join(const ACE_INET_Addr& group_address);
00072
00073 MulticastSession_rch find_or_create_session(MulticastPeer remote_peer);
00074 MulticastSession_rch find_session(MulticastPeer remote_peer);
00075
00076 bool check_header(const TransportHeader& header);
00077 bool check_header(const DataSampleHeader& header);
00078 void sample_received(ReceivedDataSample& sample);
00079
00080 bool reassemble(ReceivedDataSample& data, const TransportHeader& header);
00081
00082 private:
00083
00084 MulticastSessionFactory_rch session_factory_;
00085
00086 MulticastPeer local_peer_;
00087
00088 TransportReactorTask* reactor_task_;
00089
00090 MulticastSendStrategy_rch send_strategy_;
00091 MulticastReceiveStrategy_rch recv_strategy_;
00092
00093 unique_ptr<SingleSendBuffer> send_buffer_;
00094
00095 ACE_SOCK_Dgram_Mcast socket_;
00096
00097 ACE_SYNCH_RECURSIVE_MUTEX session_lock_;
00098
00099 typedef OPENDDS_MAP(MulticastPeer, MulticastSession_rch) MulticastSessionMap;
00100 MulticastSessionMap sessions_;
00101
00102 virtual void stop_i();
00103
00104 void syn_received_no_session(MulticastPeer source, const Message_Block_Ptr& data,
00105 bool swap_bytes);
00106
00107 void release_remote_i(const RepoId& remote);
00108 RepoIdSet readers_selected_, readers_withheld_;
00109 bool ready_to_deliver(const ReceivedDataSample& data);
00110 };
00111
00112 }
00113 }
00114
00115 OPENDDS_END_VERSIONED_NAMESPACE_DECL
00116
00117 #ifdef __ACE_INLINE__
00118 # include "MulticastDataLink.inl"
00119 #endif
00120
00121 #endif