小弟是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);
}
}
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------