TcpTransport.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008 #ifndef OPENDDS_TCPTRANSPORT_H
00009 #define OPENDDS_TCPTRANSPORT_H
00010
00011 #include "Tcp_export.h"
00012
00013 #include "dds/DCPS/transport/framework/TransportImpl.h"
00014 #include "TcpInst_rch.h"
00015 #include "TcpDataLink_rch.h"
00016 #include "TcpConnection.h"
00017 #include "TcpConnection_rch.h"
00018
00019 #include "dds/DCPS/transport/framework/TransportReactorTask_rch.h"
00020 #include "dds/DCPS/transport/framework/PriorityKey.h"
00021
00022 #include "ace/INET_Addr.h"
00023 #include "ace/Hash_Map_Manager.h"
00024 #include "ace/Synch_Traits.h"
00025 #include "ace/Connector.h"
00026 #include "ace/SOCK_Connector.h"
00027
00028 OPENDDS_BEGIN_VERSIONED_NAMESPACE_DECL
00029
00030 namespace OpenDDS {
00031 namespace DCPS {
00032
00033 class TcpAcceptor;
00034 class TcpConnectionReplaceTask;
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047 class OpenDDS_Tcp_Export TcpTransport
00048 : public TransportImpl
00049 {
00050 public:
00051
00052 explicit TcpTransport(TcpInst& inst);
00053 virtual ~TcpTransport();
00054
00055 int fresh_link(TcpConnection_rch connection);
00056
00057 virtual void unbind_link(DataLink* link);
00058 TcpInst& config() const;
00059
00060 private:
00061 virtual AcceptConnectResult connect_datalink(const RemoteTransport& remote,
00062 const ConnectionAttribs& attribs,
00063 const TransportClient_rch& client);
00064
00065 virtual AcceptConnectResult accept_datalink(const RemoteTransport& remote,
00066 const ConnectionAttribs& attribs,
00067 const TransportClient_rch& client);
00068
00069 virtual void stop_accepting_or_connecting(const TransportClient_wrch& client,
00070 const RepoId& remote_id);
00071
00072 virtual bool configure_i(TcpInst& config);
00073
00074 virtual void shutdown_i();
00075
00076 virtual bool connection_info_i(TransportLocator& local_info) const;
00077
00078
00079 virtual void release_datalink(DataLink* link);
00080
00081 virtual std::string transport_type() const { return "tcp"; }
00082
00083 void async_connect_failed(const PriorityKey& key);
00084
00085
00086
00087
00088
00089 friend class TcpConnection;
00090 friend class TcpDataLink;
00091
00092
00093
00094
00095
00096 void passive_connection(const ACE_INET_Addr& remote_address,
00097 const TcpConnection_rch& connection);
00098
00099 bool find_datalink_i(const PriorityKey& key, TcpDataLink_rch& link,
00100 const TransportClient_rch& client, const RepoId& remote_id);
00101
00102
00103
00104 int connect_tcp_datalink(TcpDataLink& link,
00105 const TcpConnection_rch& connection);
00106
00107 PriorityKey blob_to_key(const TransportBLOB& remote,
00108 Priority priority,
00109 bool active);
00110
00111
00112 typedef ACE_Hash_Map_Manager_Ex
00113 <PriorityKey,
00114 TcpDataLink_rch,
00115 ACE_Hash<PriorityKey>,
00116 ACE_Equal_To<PriorityKey>,
00117 ACE_Null_Mutex> AddrLinkMap;
00118
00119 typedef OPENDDS_MAP(PriorityKey, TcpDataLink_rch) LinkMap;
00120 typedef OPENDDS_MAP(PriorityKey, TcpConnection_rch) ConnectionMap;
00121
00122 typedef ACE_SYNCH_MUTEX LockType;
00123 typedef ACE_Guard<LockType> GuardType;
00124 typedef ACE_Condition<LockType> ConditionType;
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140 unique_ptr<TcpAcceptor> acceptor_;
00141
00142
00143 ACE_Connector<TcpConnection, ACE_SOCK_Connector> connector_;
00144
00145
00146 AddrLinkMap links_;
00147 AddrLinkMap pending_release_links_;
00148
00149
00150 LockType links_lock_;
00151
00152
00153
00154 ConnectionMap connections_;
00155
00156
00157
00158 LockType connections_lock_;
00159
00160
00161
00162
00163
00164 unique_ptr<TcpConnectionReplaceTask> con_checker_;
00165 };
00166
00167 }
00168 }
00169
00170 OPENDDS_END_VERSIONED_NAMESPACE_DECL
00171
00172 #endif