http.h
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:8k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /*
  2.  *
  3.  * Copyright (c) Xerox Corporation 1998. All rights reserved.
  4.  * This program is free software; you can redistribute it and/or modify it
  5.  * under the terms of the GNU General Public License as published by the
  6.  * Free Software Foundation; either version 2 of the License, or (at your
  7.  * option) any later version.
  8.  *
  9.  * This program is distributed in the hope that it will be useful, but
  10.  * WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  12.  * General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU General Public License along
  15.  * with this program; if not, write to the Free Software Foundation, Inc.,
  16.  * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  17.  *
  18.  * Linking this file statically or dynamically with other modules is making
  19.  * a combined work based on this file.  Thus, the terms and conditions of
  20.  * the GNU General Public License cover the whole combination.
  21.  *
  22.  * In addition, as a special exception, the copyright holders of this file
  23.  * give you permission to combine this file with free software programs or
  24.  * libraries that are released under the GNU LGPL and with code included in
  25.  * the standard release of ns-2 under the Apache 2.0 license or under
  26.  * otherwise-compatible licenses with advertising requirements (or modified
  27.  * versions of such code, with unchanged license).  You may copy and
  28.  * distribute such a system following the terms of the GNU GPL for this
  29.  * file and the licenses of the other code concerned, provided that you
  30.  * include the source code of that other code when and as the GNU GPL
  31.  * requires distribution of source code.
  32.  *
  33.  * Note that people who make modified versions of this file are not
  34.  * obligated to grant this special exception for their modified versions;
  35.  * it is their choice whether to do so.  The GNU General Public License
  36.  * gives permission to release a modified version without this exception;
  37.  * this exception also makes it possible to release a modified version
  38.  * which carries forward this exception.
  39.  *
  40.  * $Header: /cvsroot/nsnam/ns-2/webcache/http.h,v 1.14 2005/08/26 05:05:31 tomh Exp $
  41.  *
  42.  */
  43. //
  44. // Definition of the HTTP agent
  45. // 
  46. #ifndef ns_http_h
  47. #define ns_http_h
  48. #include <stdlib.h>
  49. #include <tcl.h>
  50. #include "config.h"
  51. #include "agent.h"
  52. #include "ns-process.h"
  53. #include "app.h"
  54. #include "pagepool.h"
  55. #include "inval-agent.h"
  56. #include "tcpapp.h"
  57. #include "http-aux.h"
  58. class HttpApp : public Process {
  59. public:
  60. HttpApp();
  61. virtual ~HttpApp();
  62. virtual int command(int argc, const char*const* argv);
  63. void log(const char *fmt, ...);
  64. int id() const { return id_; }
  65. virtual void process_data(int size, AppData* d);
  66. virtual AppData* get_data(int&, AppData*) {
  67. // Do not support it
  68. abort();
  69. return NULL;
  70. }
  71. protected:
  72. int add_cnc(HttpApp *client, TcpApp *agt);
  73. void delete_cnc(HttpApp *client);
  74. TcpApp* lookup_cnc(HttpApp *client);
  75. void set_pagepool(ClientPagePool* pp) { pool_ = pp; }
  76. Tcl_HashTable *tpa_; // TcpApp hash table
  77. int id_; // Node id
  78. ClientPagePool *pool_; // Page repository
  79. Tcl_Channel log_; // Log file descriptor
  80. };
  81. //----------------------------------------------------------------------
  82. // Servers
  83. //----------------------------------------------------------------------
  84. class HttpServer : public HttpApp {
  85. public: 
  86. // All methods are in TCL
  87. };
  88. class HttpInvalServer : public HttpServer {
  89. public:
  90. };
  91. // Http server with periodic unicast heartbeat invalidations
  92. class HttpYucInvalServer : public HttpInvalServer {
  93. public:
  94. HttpYucInvalServer();
  95. virtual int command(int argc, const char*const* argv);
  96. void add_inv(const char *name, double mtime);
  97. protected:
  98. // heartbeat methods
  99. HttpUInvalAgent *inv_sender_; // Heartbeat/invalidation sender
  100. InvalidationRec *invlist_; 
  101. int num_inv_;
  102. void send_heartbeat();
  103. HttpHbData* pack_heartbeat();
  104. virtual void send_hb_helper(int size, AppData *data);
  105. InvalidationRec* get_invrec(const char *name);
  106. int Ca_, Cb_, push_thresh_, enable_upd_;
  107. int push_high_bound_, push_low_bound_;
  108. double hb_interval_; // Heartbeat interval (second)
  109. };
  110. //----------------------------------------------------------------------
  111. // Clients
  112. //----------------------------------------------------------------------
  113. // Place holder: everything is in OTcl. We declare it as a split object
  114. // in case that its derived classes need some C++ handling.
  115. class HttpClient : public HttpApp {
  116. };
  117. //----------------------------------------------------------------------
  118. // Caches
  119. //----------------------------------------------------------------------
  120. class HttpCache : public HttpApp {
  121. };
  122. class HttpInvalCache : public HttpCache {
  123. };
  124. // Invalidations embedded in periodic heartbeats
  125. // Used by recv_inv() and recv_inv_filter() to filter invalidations.
  126. const int HTTP_INVALCACHE_FILTERED  = 0;
  127. const int HTTP_INVALCACHE_UNFILTERED  = 1;
  128. // Http cache with periodic multicast heartbeat invalidation
  129. class HttpMInvalCache : public HttpInvalCache {
  130. public:
  131. HttpMInvalCache();
  132. virtual ~HttpMInvalCache();
  133. virtual int command(int argc, const char*const* argv);
  134. virtual void process_data(int size, AppData* data);
  135. virtual void timeout(int reason);
  136. void handle_node_failure(int cid);
  137. void invalidate_server(int sid);
  138. void add_inv(const char *name, double mtime);
  139. protected:
  140. HBTimer hb_timer_; // Heartbeat/Inval timer
  141. HttpInvalAgent **inv_sender_; // Heartbeat/Inval sender agents
  142. int num_sender_; // # of heartbeat sender agents
  143. int size_sender_; // Maximum size of array inv_sender_
  144. InvalidationRec *invlist_; // All invalidations to be sent
  145. int num_inv_; // # of invalidations in invlist_
  146. void send_heartbeat();
  147. HttpHbData* pack_heartbeat();
  148. virtual void send_hb_helper(int size, AppData *data);
  149. int recv_inv(HttpHbData *d);
  150. virtual void process_inv(int n, InvalidationRec *ivlist, int cache);
  151. virtual int recv_inv_filter(ClientPage* pg, InvalidationRec *p) {
  152. return ((pg == NULL) || (pg->mtime() >= p->mtime()) ||
  153. !pg->is_valid()) ? 
  154. HTTP_INVALCACHE_FILTERED : HTTP_INVALCACHE_UNFILTERED;
  155. }
  156. InvalidationRec* get_invrec(const char *name);
  157. // Maintaining SState(Server, NextCache)
  158. // Use the shadow names of server and cache as id
  159. struct SState {
  160. SState(NeighborCache* c) : down_(0), cache_(c) {}
  161. int is_down() { return down_; }
  162. void down() { down_ = 1; }
  163. void up() { down_ = 0; }
  164. NeighborCache* cache() { return cache_; }
  165. int down_; // If the server is disconnected
  166. NeighborCache *cache_; // NextCache
  167. };
  168. Tcl_HashTable sstate_;
  169. void add_sstate(int sid, SState* sst);
  170. SState* lookup_sstate(int sid);
  171. // check & establish sstate
  172. void check_sstate(int sid, int cid); 
  173. // Maintaining liveness of neighbor caches
  174. Tcl_HashTable nbr_;
  175. void add_nbr(HttpMInvalCache* c);
  176. NeighborCache* lookup_nbr(int id);
  177. HttpUInvalAgent *inv_parent_; // Heartbeat/Inval to parent cache
  178. void recv_heartbeat(int id);
  179. void recv_leave(HttpLeaveData *d);
  180. void send_leave(HttpLeaveData *d);
  181. double hb_interval_; // Heartbeat interval (second)
  182. int enable_upd_; // Whether enable push
  183. int Ca_, Cb_, push_thresh_;
  184. int push_high_bound_, push_low_bound_;
  185. HttpInvalAgent **upd_sender_; // Agents to push updates to
  186. int num_updater_; // # number of update agents
  187. int size_updater_; // Size of array upd_sender_
  188. void add_update(const char *name, double mtime);
  189. void send_upd(ClientPage *pg);
  190. int recv_upd(HttpUpdateData *d);
  191. virtual void send_upd_helper(int pgsize, AppData* data);
  192. HttpUpdateData* pack_upd(ClientPage *pg);
  193. // Use a static mapping to convert cache id to cache pointers
  194. static HttpMInvalCache** CacheRepository_;
  195. static int NumCache_;
  196. static void add_cache(HttpMInvalCache* c);
  197. static HttpMInvalCache* map_cache(int id) {
  198. return CacheRepository_[id];
  199. }
  200. };
  201. //----------------------------------------------------------------------
  202. // Multicast invalidation + two way liveness messages + 
  203. // invalidation filtering. 
  204. //----------------------------------------------------------------------
  205. class HttpPercInvalCache : virtual public HttpMInvalCache {
  206. public:
  207. HttpPercInvalCache();
  208. int command(int argc, const char*const* argv);
  209. protected: 
  210. virtual int recv_inv_filter(ClientPage *pg, InvalidationRec *ir) {
  211. // If we already have an invalid page, don't forward the
  212. // invalidation any more.
  213. return ((pg == NULL) || (pg->mtime() >= ir->mtime()) ||
  214. !pg->is_header_valid()) ? 
  215. HTTP_INVALCACHE_FILTERED : HTTP_INVALCACHE_UNFILTERED;
  216. }
  217. // Flag: if we allow direct request, and hence pro formas
  218. int direct_request_;
  219. };
  220. #endif // ns_http_h