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

通讯编程

开发平台:

Visual C++

  1. /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
  2. /*
  3.  * logweb.cc
  4.  * Copyright (C) 2001 by the University of Southern California
  5.  * $Id: logweb.cc,v 1.6 2006/02/21 15:20:20 mahrenho Exp $
  6.  *
  7.  * This program is free software; you can redistribute it and/or
  8.  * modify it under the terms of the GNU General Public License,
  9.  * version 2, as published by the Free Software Foundation.
  10.  *
  11.  * This program is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License along
  17.  * with this program; if not, write to the Free Software Foundation, Inc.,
  18.  * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
  19.  *
  20.  *
  21.  * The copyright of this module includes the following
  22.  * linking-with-specific-other-licenses addition:
  23.  *
  24.  * In addition, as a special exception, the copyright holders of
  25.  * this module give you permission to combine (via static or
  26.  * dynamic linking) this module with free software programs or
  27.  * libraries that are released under the GNU LGPL and with code
  28.  * included in the standard release of ns-2 under the Apache 2.0
  29.  * license or under otherwise-compatible licenses with advertising
  30.  * requirements (or modified versions of such code, with unchanged
  31.  * license).  You may copy and distribute such a system following the
  32.  * terms of the GNU GPL for this module and the licenses of the
  33.  * other code concerned, provided that you include the source code of
  34.  * that other code when and as the GNU GPL requires distribution of
  35.  * source code.
  36.  *
  37.  * Note that people who make modified versions of this module
  38.  * are not obligated to grant this special exception for their
  39.  * modified versions; it is their choice whether to do so.  The GNU
  40.  * General Public License gives permission to release a modified
  41.  * version without this exception; this exception also makes it
  42.  * possible to release a modified version which carries forward this
  43.  * exception.
  44.  *
  45.  */
  46. //
  47. // Generate web traffic based on HTTP log
  48. // Xuan Chen (xuanc@isi.edu)
  49. //
  50. #include <tclcl.h>
  51. #include "logweb.h"
  52. // Timer to send requests
  53. RequestTimer::RequestTimer(LogWebTrafPool* pool) {
  54. lwp = pool;
  55. }
  56. void RequestTimer::expire(Event *e) {
  57. //if (e) 
  58. // Packet::free((Packet *)e);
  59. lwp->run();
  60. }
  61. static class LogWebTrafPoolClass : public TclClass {
  62. public:
  63.         LogWebTrafPoolClass() : TclClass("PagePool/WebTraf/Log") {}
  64.         TclObject* create(int, const char*const*) {
  65. return (new LogWebTrafPool());
  66. }
  67. } class_logwebtrafpool;
  68. LogWebTrafPool::LogWebTrafPool() {
  69. num_obj = 0;
  70. // initialize next request
  71. next_req.time = 0;
  72. next_req.client = 0;
  73. next_req.server = 0;
  74. next_req.size = 0;
  75. // initialize request timer
  76. req_timer = new RequestTimer(this);
  77. start_t = 0;
  78. }
  79. LogWebTrafPool::~LogWebTrafPool() {
  80. if (fp)
  81. fclose(fp);
  82. if (req_timer) delete req_timer;
  83. }
  84. int LogWebTrafPool::loadLog(const char* filename) {
  85. fp = fopen(filename, "r");
  86. if (fp == 0)
  87. return(0);
  88. return(1);
  89. }
  90. int LogWebTrafPool::start() {
  91. start_t = Scheduler::instance().clock();
  92. processLog();
  93. return(1);
  94. }
  95. int LogWebTrafPool::processLog() {
  96. int time, client, server, size;
  97. if (!feof(fp)) {
  98. fscanf(fp, "%d %d %d %dn", &time, &client, &server, &size);
  99. // save information for next request
  100. next_req.time = time;
  101. next_req.client = client;
  102. next_req.server = server;
  103. next_req.size = size;
  104. double now = Scheduler::instance().clock();
  105. double delay = time + start_t - now;
  106. req_timer->resched(delay);
  107. return(1);
  108. } else 
  109. return(0);
  110. }
  111. int LogWebTrafPool::run() {
  112. launchReq(next_req.client, next_req.server, next_req.size);
  113. processLog();
  114. return(1);
  115. }
  116. Node* LogWebTrafPool::picksrc(int id) {
  117. int n = id % nClient_;
  118. assert((n >= 0) && (n < nClient_));
  119. return client_[n];
  120. }
  121. Node* LogWebTrafPool::pickdst(int id) {
  122. int n = id % nServer_;
  123. assert((n >= 0) && (n < nServer_));
  124. return server_[n].get_node();
  125. }
  126. int LogWebTrafPool::launchReq(int cid, int sid, int size) {
  127. TcpAgent *tcp;
  128. Agent *snk;
  129. // Allocation new TCP connections for both directions
  130. pick_ep(&tcp, &snk);
  131. // pick client and server nodes
  132. Node* client = picksrc(cid);
  133. Node* server = pickdst(sid);
  134. int num_pkt = size / 1000 + 1;
  135. // Setup TCP connection and done
  136. Tcl::instance().evalf("%s launch-req %d %d %s %s %s %s %d %d", 
  137.       name(), num_obj++, num_obj,
  138.       client->name(), server->name(),
  139.       tcp->name(), snk->name(), num_pkt, NULL);
  140. return(1);
  141. }
  142. int LogWebTrafPool::command(int argc, const char*const* argv) {
  143. if (argc == 2) {
  144. if (strcmp(argv[1], "start") == 0) {
  145. if (start())
  146. return (TCL_OK);
  147. else
  148. return (TCL_ERROR);
  149. }
  150. } else if (argc == 3) {
  151. if (strcmp(argv[1], "loadLog") == 0) {
  152. if (loadLog(argv[2]))
  153. return (TCL_OK);
  154. else
  155. return (TCL_ERROR);
  156. } else if (strcmp(argv[1], "doneObj") == 0) {
  157. return (TCL_OK);
  158. }
  159. return WebTrafPool::command(argc, argv);
  160. }