📄 htbp_session.h
字号:
// -*- C++ -*-
//=============================================================================
/**
* @file HTBP_Session.h
*
* $Id: HTBP_Session.h 80826 2008-03-04 14:51:23Z wotte $
*
* @author Phil Mesnier
*/
//=============================================================================
#ifndef ACE_HTBP_SESSION_H
#define ACE_HTBP_SESSION_H
#include /**/ "ace/pre.h"
#include "ace/SOCK_IO.h"
#include "ace/Hash_Map_Manager.h"
#include "ace/Synch.h"
#include "ace/Message_Queue.h"
#if !defined (ACE_LACKS_PRAGMA_ONCE)
# pragma once
#endif /* ACE_LACKS_PRAGMA_ONCE */
#include "HTBP_Addr.h"
#include "HTBP_Export.h"
#include "HTBP_Channel.h"
#include "HTBP_Stream.h"
ACE_BEGIN_VERSIONED_NAMESPACE_DECL
// Forward declarations.
class ACE_HTBP_Filter;
class ACE_Event_Handler;
namespace ACE
{
namespace HTBP
{
class Session_Id_t
{
public:
ACE_UINT32 id_;
Addr local_;
Addr peer_;
u_long hash () const;
bool operator ==(const Session_Id_t &other) const;
};
/**
* @class Session
*
* @brief Defines the methods in the <Session> abstraction.
*
* A session is an entity that combines two Ht_Channels that connect directly
* to a proxy to manage communication with a remote peer. The Session may
* persist longer than either stream, assuming that the proxy is libel to
* close a connection at any time.
*
* This means that the session needs to be able to reconnect to the remote
* peer. This also means that the session needs to be aware of its location
* If it is outside the proxy and looses a stream, oh well. If it is inside,
* then the next time a stream is required, then it must reconnect before
* returning the stream.
*
* The session does not queue outbound messages. That is going to be the
* responsibility of the application, or a higher level protocol wrapper.
*/
class HTBP_Export Session
{
public:
// Initialization and termination methods.
/// Constructor.
Session (void);
/// Constructor (sets the underlying session id with <sid>).
Session (const Addr& peer,
const Addr& local,
ACE_UINT32 sid = 0,
ACE_INET_Addr *proxy = 0,
int take_proxy = 0);
Session (const Session_Id_t &id,
ACE_INET_Addr *proxy = 0,
int take_proxy = 0);
Session (const Session &other);
Session& operator= (const Session &other);
/// Destructor.
~Session (void);
/// The following methods are specific to the Session
static ACE_UINT32 next_session_id ();
static int add_session (Session *);
static int remove_session (Session *);
static int find_session (const Session_Id_t&,
Session *&out);
Stream *stream (void) const;
void stream (Stream *);
int enqueue (ACE_Message_Block *msg);
int flush_outbound_queue (void);
int close_inbound (void) const;
int close_outbound (void) const;
/// get references to the actual streams based on the direction
/// of data flow if this session is on the inside of the proxy
/// ie, has a non-null proxy addr, then the inbound stream is
/// the out_to_in stream, otherwise it is the in_to_out
/// stream. The outbound is the opposite of the inbound.
/// Whenever an application wishes to send data, whether that is
/// request or reply data, it uses the outbound stream, and it
/// should associate an event handler with the inbound stream
/// for receiving data.
Channel *inbound (void) const;
Channel *outbound (void) const;
void inbound (Channel *);
void outbound (Channel *);
int enable (int value);
int disable (int value);
const Session_Id_t& session_id(void) const;
void session_id (ACE_UINT32 );
const ACE_INET_Addr *proxy_addr (void) const;
void proxy_addr (ACE_INET_Addr *, int destroy = 0);
const Addr &peer_addr (void) const;
const Addr &local_addr (void) const;
void peer_addr (const Addr &);
void local_addr (const Addr &);
/// invoke close on both streams, then remove self from session map
int close (void);
ACE_Event_Handler *handler (void);
void handler (ACE_Event_Handler *);
void reactor (ACE_Reactor *);
void detach (Channel *);
int sock_flags(void) const;
private:
/// Connected Stream ensures that the particular stream is
/// connected to the proxy, if possible. The result is same as
/// the reference passed in, so that it may be used inline for
/// the inboundor outbound methods
void reconnect ();
void reconnect_i (Channel *);
typedef ACE_Hash_Map_Manager<Session_Id_t, Session*,
ACE_SYNCH_MUTEX> Session_Map;
typedef ACE_Hash_Map_Entry <Session_Id_t, Session*> Map_Entry;
static Session_Map session_map_;
static ACE_UINT32 last_session_id_;
static ACE_SYNCH_MUTEX session_id_lock_;
ACE_INET_Addr *proxy_addr_;
int destroy_proxy_addr_;
Session_Id_t session_id_;
Channel *inbound_;
Channel *outbound_;
Filter *inbound_filter_;
Filter *outbound_filter_;
int closed_;
ACE_Event_Handler *handler_;
ACE_Reactor *reactor_;
ACE_Message_Queue<ACE_SYNCH> outbound_queue_;
Stream * stream_;
int sock_flags_;
};
}
}
ACE_END_VERSIONED_NAMESPACE_DECL
#if defined (__ACE_INLINE__)
#include "HTBP_Session.inl"
#endif
#include /**/ "ace/post.h"
#endif /* ACE_HTBP_SESSION_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -