線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1362
推到 Plurk!
推到 Facebook!

[問題]以bench mark測試Web server程式的錯誤請教

缺席
tanray
一般會員


發表:1
回覆:0
積分:0
註冊:2003-12-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-03-06 22:06:47 IP:61.219.xxx.xxx 未訂閱
小弟是BCB的新手,寫了一個web server 的程式,可以正常在瀏覽器上閱讀所要求的檔案,可是在Webserver Stress Tool中測試,都無法通過測試,會出現以下的log,小弟已debug 2個星期了,想請問各位先進,這是什麼問題所致??謝謝....
Webserver Stress Tool - Logfile for User #1
2004/3/6 下午 10:02:34: User #1 Click #1: Waiting for global click delay: 0s
2004/3/6 下午 10:02:34: User #1 Click #1: ** Click #1 started, used URL #1 (), from IP=192.168.1.134
2004/3/6 下午 10:02:34: User #1 Click #1: Request 1 HTTP State: Initialized (0 ms)
2004/3/6 下午 10:02:34: User #1 Click #1: Request 1 HTTP State: DNS Lookup begin (0 ms)
2004/3/6 下午 10:02:34: User #1 Click #1: Request 1 HTTP State: DNS Lookup done (0 ms)
2004/3/6 下午 10:02:34: User #1 Click #1: Request 1 HTTP State: Connected (6 ms)
2004/3/6 下午 10:02:34: User #1 Click #1: Request 1 HTTP State: Waiting for header (6 ms)
2004/3/6 下午 10:02:34: User #1 Click #1: Request 1 HTTP State: Receiving Header (291 ms) (=Time to First Byte)
2004/3/6 下午 10:02:34: User #1 Click #1: Request 1 HTTP State: Waiting for body (291 ms)
2004/3/6 下午 10:02:34: User #1 Click #1: Request 1 HTTP State: Done (296 ms)
2004/3/6 下午 10:02:34: User #1 Click #1: CLICK-Request 1: Time=296 ms, TFB=291ms, Bytes=236, HTTP-StatusCode=0 ((unknown http result)) URL #1=http://127.0.0.1:8000 
2004/3/6 下午 10:02:34: User #1 Click #1: !FAILED! All requests of click done, but at least one request failed with HTTP result 0 (=(unknown http result)), (297 ms)  
 
//---------------------------------------------------------------------------
#include 
#include 
#pragma hdrstop
#include "Vcl\Registry.hpp"
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
#define SERVER_VERSION "Web Server 1"
//---------------------------------------------------------------------------
   AnsiString WebPath;
   AnsiString star;
   int response =200;
//---------------------------------------------------------------------------
AnsiString GetContentType(AnsiString Path )
  {       AnsiString Key;
   AnsiString res;
   TRegistry* reg =new TRegistry();           reg->RootKey =  HKEY_CLASSES_ROOT;
   Key = ExtractFileExt(Path);
   if (reg->OpenKey(Key , false))
   {
    res = reg->ReadString("Content Type");
    reg->CloseKey();
   }       if (res.IsEmpty())
    res = "application/octet-stream";       delete reg;
   return res;
 }
//---------------------------------------------------------------------------
  AnsiString NotFoundPage(AnsiString Host)
  {
   response=404;
   AnsiString msg1 =
   "<title>HTTP 404 找不到指定的檔案</title>\r\n"   "<body text=\"#ff0000\">\r\n"   "找不到指定的檔案\r\n"   "</body>\r\n";       AnsiString msg2 =
   "Http/1.1 404 找不到指定的檔案 \r\n"   "Server: "   AnsiString(SERVER_VERSION)   "\r\n"   "Connection: close\r\n"   "Content-Type: text/html\r\n"   "Accept-Ranges: byte\r\n"   "Content-Length: "  IntToStr( msg1.Length())  "\r\n\r\n"   msg1;       return msg2;
  }
//---------------------------------------------------------------------------
#define _BUFFERSIZE (1024*1024)
AnsiString FoundPage( AnsiString Path, AnsiString Host,TCustomWinSocket* Socket)
{  response=200;
   //將找到的內容傳回
   AnsiString msg1 =
   "HTTP/1.1 200 Ok\r\n"   "Server: "   AnsiString(SERVER_VERSION)   "\r\n"   "Connection: close\r\n"   "Content-Location: http://"   Host  "\r\n"   "Date: "  DateTimeToStr(Now())  "\r\n"   "Content-Type: "  GetContentType(Path)   "\r\n"   "Accept-Range: bytes\r\n";      if  ( FileExists(Path))
   {
     char* Buffer =new char[_BUFFERSIZE 1];
     int FileHandle = FileOpen(Path, fmOpenRead);
     int FileLength = FileSeek(FileHandle,0,2);
     FileSeek(FileHandle,0,0);        msg1  =
    "Content-Length: " 
    IntToStr(FileLength)   "\r\n\r\n";
    //
    if (Socket->Connected)
    //Socket->SendBuf(msg1.c_str(), msg1.Length());
    Socket->SendText(msg1);
    do
     {
     int rBytes =
         FileRead(FileHandle, Buffer, _BUFFERSIZE);         if ((rBytes > 0) && Socket->Connected)
      Socket->SendBuf(Buffer, rBytes);
     else
      break;
     } while(true);
     delete[] Buffer;
     FileClose(FileHandle);
     return " ";        //return "\r\n";
    }
  else
    return "Content-Length: 0 \r\n\r\n";
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   AnsiString Path;
   if (OpenDialog1->Execute())
   Path = OpenDialog1->FileName;
   star = ExtractFileDir( OpenDialog1->FileName);
   WebPath=star;
   AnsiString tmp;
   tmp = OpenDialog1->FileName;
   int _pos;
    _pos = ComboBox1->Items->IndexOf(tmp);
   if ( _pos == -1)
   {
    ComboBox1->Items->Add(OpenDialog1->FileName);
    ComboBox1->ItemIndex = ComboBox1->Items->Count-1;
   }
   else
    ComboBox1->ItemIndex = _pos;
    //
    this->ActiveControl = ComboBox1;    }
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
   ServerSocket1->Active=false;
   //
   if (Edit1->Text != "")
    ServerSocket1->Port=Edit1->Text.ToInt();
   else
    ServerSocket1->Port=80;
   //
   Edit1->Enabled=false;
   ServerSocket1->Active=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
  ServerSocket1->Active=false;
  Edit1->Enabled=true;
  Memo1->Lines->Clear();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ServerSocket1Accept(TObject *Sender,
      TCustomWinSocket *Socket)
{
   Memo1->Lines->Add( Socket->RemoteAddress);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
   AnsiString ReceiveText;
   ReceiveText  = Socket->ReceiveText();       if (ReceiveText.Pos("\r\n\r\n") == 0)
   return;
   //
   if (ListBox1->Count<=0)
   return;
   //
   if (ListBox1->ItemIndex<0)
    ListBox1->ItemIndex=0;
   //
   TStrings* sl = new TStringList();
   sl->CommaText=ListBox1->Items->Strings[ListBox1->ItemIndex];       ReceiveText = ReceiveText.SubString(1,
             ReceiveText.Pos("\r\n\r\n") 3);       TStrings* RecMsg = new TStringList();
   //將所有資料放入 TStrings 物件
   int pos1 = -1;
   do {
     pos1 = ReceiveText.Pos(": ");
   if (pos1 > 0) {
   ReceiveText.Delete(pos1, 2);
   ReceiveText.Insert("=", pos1);
                 }
      } while (pos1 !=0 );
   RecMsg->Text = ReceiveText;
   Memo1->Lines->Add(ReceiveText);       //ReceiveText 必需要清除, 要不然會將下一次的指令累加進來
   ReceiveText = "";       //取出 GET 指令之後的字串, 也就是瀏覽器要讀取的網頁檔
   AnsiString GetStr =
   RecMsg->Strings[0].SubString(5,
     RecMsg->Strings[0].Pos("HTTP/1.1")-6);       //取出主機名稱
   AnsiString Host = RecMsg->Values["Host"];       AnsiString Referer = RecMsg->Values["Referer"];
   Referer =  Referer.SubString(8, Referer.Length());
   Referer =  Referer.SubString(Referer.Pos("/")   1,
                      Referer.Length());       //如果指定的網頁檔字串只有一個字元 '/'
   //表示要讀取根目錄內的內定網頁檔,
   //本程式內定為 index.html
   AnsiString msg;
   if (GetStr == "/") {
   if (FileExists(WebPath   "/index.html"))
   { msg = FoundPage(WebPath   "/index.html",
          Host, Socket);
    //Socket->SendText("HTTP/1.1 %d OK\r\n",response);
   }
   else
    {
    msg = NotFoundPage(Host);
    //Socket->SendText("HTTP/1.1 %d error\r\n",response);
    }
   }
 //讀取根目錄內其他檔案或是子目錄內的檔案
   else if (GetStr.Length() > 1) {
  //將所有的 斜線'/' 換成 倒斜線'\',
   int pos1 = -1;
   do {
    pos1 = GetStr.Pos("/");
    if (pos1 > 0) {
    GetStr.Delete(pos1, 1);
    GetStr.Insert("\\", pos1);
    }
   } while (pos1 != 0);       if (GetStr.Pos("\\") == 0)
   if (!Referer.IsEmpty())
    WebPath  = Referer;       AnsiString OtherPage = "";
   if (*(WebPath.AnsiLastChar()) != '\\')
   OtherPage = WebPath   GetStr;
   else
   OtherPage = WebPath  
                GetStr.SubString(2, GetStr.Length());      //檢查最後一個路徑名稱是否為檔案名稱,
  //若不是則在字串最後加上一個倒斜線,
  //此步驟的作用在後面程式會用到
   if (ExtractFileName(OtherPage).Pos(".") == 0)
   OtherPage  = "\\";       if (ExtractFileName(OtherPage).IsEmpty())
   OtherPage  = "/index.html";      if (FileExists(OtherPage))
  {
   msg = FoundPage(OtherPage, Host, Socket);      }
  else //都找不到檔案則顯示錯誤
   {
   msg = NotFoundPage(Host);       }
  }
  else if (GetStr.IsEmpty())
  msg = NotFoundPage(Host);      if (!msg.IsEmpty())
  //Socket->SendBuf(msg.c_str(), msg.Length());
   for ( int i=0; iSocket->ActiveConnections; i  )
   {
    if (ServerSocket1->Socket->Connections[i]->RemoteAddress==sl->Strings[0]&&
        ServerSocket1->Socket->Connections[i]->RemoteHost==sl->Strings[1]&&
        ServerSocket1->Socket->Connections[i]->SocketHandle==StrToInt(sl->Strings[2]))
     {
      ServerSocket1->Socket->Connections[i]->SendBuf(msg.c_str(),msg.Length());
      //ServerSocket1->Socket->Connections[i]->SendText(IntToStr(response));         }
    }
   delete sl;
   Socket->Close();
  delete RecMsg;
}    //---------------------------------------------------------------------------
void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
   WebPath = ComboBox1->Text;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
   ComboBox1->Text=" ";
   Memo1->Lines->Clear();
   Edit1->Text="";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
   Application->Terminate();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ServerSocket1ClientConnect(TObject *Sender,
      TCustomWinSocket *Socket)
{
   AnsiString szRemoteIP=Socket->RemoteAddress;
   AnsiString szRemoteHost=Socket->RemoteHost;
   AnsiString szSocketHandle=IntToStr(Socket->SocketHandle);
   AnsiString szClientList=szRemoteIP "," szRemoteHost "," szSocketHandle;
   int i =ListBox1->Items->IndexOf(szClientList);
   if (i<0)
   {
     ListBox1->Items->Add(szClientList);
   }
}
//---------------------------------------------------------------------------    void __fastcall TForm1::ServerSocket1ClientDisconnect(TObject *Sender,
      TCustomWinSocket *Socket)
{
   AnsiString szRemoteIP=Socket->RemoteAddress;
   AnsiString szRemoteHost=Socket->RemoteHost;
   AnsiString szSocketHandle=IntToStr(Socket->SocketHandle);
   AnsiString szClientList=szRemoteIP "," szRemoteHost "," szSocketHandle;
   int i = ListBox1->Items->IndexOf(szClientList);
   if (i>=0)
   {
    ListBox1->Items->Delete(i);
   }
}
//---------------------------------------------------------------------------    //---------------------------------------------------------------------------    
系統時間:2024-05-11 4:49:28
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!