小弟debug的功夫太差,看了半天也沒抓到問題,我把測試的Client端程式也post上來,我有把檔案傳到會員求助程式檔案上傳區,如果各位大大有空的話,能否幫我看一下… 我的基本傳輸方式是由Client端先發送指令建立連線,然後再送指令要求Server傳送檔案,而檔案是分成多個1k為單位的封包。從我log到的訊息中看出來,Client端最後有送出文字訊息到Server端,server不知為何並未收到該訊息(難道是Server在未收到訊息前就掛了?),我實在是看不出來那邊可能會產生"Index out of bounds (0)"的機會,能否再請大家幫一下忙,感謝大家的熱心! //===================================================================
//Server端最後的完整程式碼
//-------------------------------------------------------------------
//--------------------------------------------------------------------------- #include
#pragma hdrstop #include "Unit1.h"
#include
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
FILE *fp;
TForm1 *Form1;
#define MAX_STRLEN 16
#define MAX_FILENAME_LEN 255
#define MAX_DATASIZE 1024
typedef struct _MyPack
{
char szHeader[MAX_STRLEN];
char szFileName[MAX_FILENAME_LEN];
DWORD dwPackTotal;
DWORD dwPackCount;
DWORD dwTotalDataSize;
DWORD dwThisDataSize;
BYTE pbThisData[MAX_DATASIZE];
} MYPACK; //---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender)
{
Button1->Enabled = false ;
JPEG_PATH = "c:\\My Documents\\My Pictures\\";
SLEEP_TIME = 50 ;
Timer1->Enabled = false ;
Timer1->Interval = 30000 ;
Timer2->Enabled = false ;
Timer2->Interval = 1000 ;
fp=fopen("c:\\server.msg","w");
}
//--------------------------------------------------------------------------- void __fastcall TForm1::FormDestroy(TObject *Sender)
{
ServerSocket1->Active = false ;
ServerSocket1->Close();
Timer1->Enabled = false ;
fclose(fp);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TMemoryStream *msFile=new TMemoryStream;
OpenDialog1->Filter = "*.jpg";
if (OpenDialog1->Execute())
msFile->LoadFromFile(OpenDialog1->FileName);
MYPACK mp;
int i=0;
int block=(msFile->Size%MAX_DATASIZE==0)?
msFile->Size/MAX_DATASIZE: msFile->Size/MAX_DATASIZE 1; for(i=0; iFileName.c_str());
mp.dwPackTotal=block;
mp.dwPackCount=i;
mp.dwTotalDataSize=msFile->Size;
mp.dwThisDataSize=((i 1)*MAX_DATASIZE>msFile->Size)?
msFile->Size-i*MAX_DATASIZE: MAX_DATASIZE;
msFile->Position=i*MAX_DATASIZE;
msFile->Read(mp.pbThisData, mp.dwThisDataSize); ServerSocket1->Socket->Connections[0]->SendBuf(&mp, sizeof(MYPACK));
Sleep(SLEEP_TIME);
}
StatusBar1->SimpleText = OpenDialog1->FileName "(" mp.dwTotalDataSize "Byte)傳送完成" ;
delete msFile;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ServerSocket1Accept(TObject *Sender,
TCustomWinSocket *Socket)
{
StatusBar1->SimpleText = "接受" Socket->RemoteHost "之連線" ;
Button1->Enabled = true ;
Button1->Caption = "傳送圖片給" Socket->RemoteHost ;
char szz[256]={0};
AnsiString mes = "Server " StatusBar1->SimpleText ;
sprintf(szz, "%s", mes);
OutputDebugStringA(szz);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ServerSocket1ClientConnect(TObject *Sender,
TCustomWinSocket *Socket)
{
StatusBar1->SimpleText = "與" Socket->RemoteHost "連線中" ;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ServerSocket1ClientDisconnect(TObject *Sender,
TCustomWinSocket *Socket)
{
StatusBar1->SimpleText = "與" Socket->RemoteHost "連線中斷" ;
char szz[256]={0};
AnsiString mes = "Server " StatusBar1->SimpleText ;
sprintf(szz, "%s", mes);
OutputDebugStringA(szz);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ServerSocket1ClientError(TObject *Sender,
TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
ErrorCode = 0 ;
StatusBar1->SimpleText = "Error from Client socket" ;
StatusBar1->SimpleText = "Client 端發生錯誤!已中斷與" Socket->RemoteHost
"之連線,請重新開啟伺服器" ;
for(int i=0; iSocket->ActiveConnections; i )
{
if(Socket->RemoteAddress==ServerSocket1->Socket->Connections[i]->RemoteAddress)
{
ServerSocket1->Socket->Disconnect(i);
}
}
char szz[256]={0};
AnsiString mes = "Server " StatusBar1->SimpleText ;
sprintf(szz, "%s", mes);
OutputDebugStringA(szz);
// ServerSocket1->Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ServerSocket1Listen(TObject *Sender,
TCustomWinSocket *Socket)
{
StatusBar1->SimpleText = Socket->LocalHost " Port" Socket->LocalPort "等待用戶連線…" ;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::mnuListenClick(TObject *Sender)
{
ServerSocket1->Port=StrToInt(InputBox("伺服器設定","傳輸埠","4000"));
ServerSocket1->Open();
}
//--------------------------------------------------------------------------- void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
ClientMessage = Socket->ReceiveText();
AnsiString filename; char sz[256]={0};
AnsiString mes = "Server收到" ClientMessage ;
sprintf(sz, "%s", mes);
OutputDebugStringA(sz); if (ClientMessage.SubString(1,15) == "RecievedLength=")
{
if (StrToInt(ClientMessage.SubString(16,ClientMessage.Length())) == LastPacketSize )
{
ClientReceived = true ;
}
}
else if (ClientMessage.SubString(1,7) == "Command")
{
if (ClientMessage=="Command_1")
{
for (int i=0;i<1000;i )
{
filename.printf("d",i&);
filename=JPEG_PATH filename ".jpg";
SendImage0(filename);
}
}
else if (ClientMessage=="Command_2")
{
SendImage0("c:\\0000.jpg");
}
else if (ClientMessage=="Command_3")
{
SendImage0("c:\\0002.jpg");
}
}
}
//---------------------------------------------------------------------------
void TForm1::SendImage0(AnsiString image_name)
{
TMemoryStream *msFile=new TMemoryStream;
msFile->LoadFromFile(image_name);
MYPACK mp;
int i=0;
int block=(msFile->Size%MAX_DATASIZE==0)?
msFile->Size/MAX_DATASIZE: msFile->Size/MAX_DATASIZE 1; for(i=0; iSize;
mp.dwThisDataSize=((i 1)*MAX_DATASIZE>msFile->Size)?
msFile->Size-i*MAX_DATASIZE: MAX_DATASIZE;
msFile->Position=i*MAX_DATASIZE;
msFile->Read(mp.pbThisData, mp.dwThisDataSize); ServerSocket1->Socket->Connections[0]->SendBuf(&mp, sizeof(MYPACK));
ClientReceived = false ; LastPacketSize = mp.dwThisDataSize ; Timer1->Enabled = true ;
//在Server端未接獲Client端傳來訊息前暫時停止傳送封包
StatusBar1->SimpleText = "等待Client端回報訊息..." ;
Timer2->Enabled = true ;
elaps_time = 0;
while (!ClientReceived)
{
Application->ProcessMessages();
StatusBar1->SimpleText = "等待Client回應 :" IntToStr(elaps_time) "/" IntToStr(Timer1->Interval/1000) ;
}
// Sleep(SLEEP_TIME);
}
StatusBar1->SimpleText = image_name "(" mp.dwTotalDataSize "Byte)傳送完成" ;
delete msFile;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SleepTime1Click(TObject *Sender)
{
SLEEP_TIME = StrToInt(InputBox("Sleep Time Setting","Sleep Time (ns) = ","100"));
}
//--------------------------------------------------------------------------- void __fastcall TForm1::jpegpath1Click(TObject *Sender)
{
JPEG_PATH = InputBox("JPEG Path Setting","The Path including JPEGs : ","c:\\My Documents\\My Pictures\\");
}
//--------------------------------------------------------------------------- void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
Timer1->Enabled = false ;
ServerSocket1->Socket->Disconnect(0);
StatusBar1->SimpleText = ServerSocket1->Socket->Connections[0]->RemoteHost "沒有回應,連線中斷" ;
}
//--------------------------------------------------------------------------- void __fastcall TForm1::WaitTime1Click(TObject *Sender)
{
Wait_Time = StrToInt(InputBox("Wait Time Setting : ","Wait Client for (ms) : ",""));
Timer1->Interval = Wait_Time ;
ServerSocket1->Socket->SendText("Clinet Response Timeout");
}
//--------------------------------------------------------------------------- void __fastcall TForm1::Timer2Timer(TObject *Sender)
{
elaps_time ;
StatusBar1->SimpleText = "等待Client回應 :" IntToStr(elaps_time) "/" IntToStr(Timer1->Interval/1000) ;
}
//---------------------------------------------------------------------------
//===================================================================
//Client端最後的完整程式碼
//-------------------------------------------------------------------
//--------------------------------------------------------------------------- #include
#pragma hdrstop #include "Unit1.h"
#include
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender)
{
ClientSocket1->Address = "192.168.0.95";
ClientSocket1->Port = 4000 ;
ClientSocket1->Active = true ;
ClientSocket1->Socket->SendText("Command_1");
StatusBar1->SimpleText = "Command_1 was sent" ;
}
//--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender)
{
ClientSocket1->Active = false ;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ClientSocket1Connect(TObject *Sender,
TCustomWinSocket *Socket)
{
StatusBar1->SimpleText = "現在正與" Socket->RemoteHost "連線" ;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ClientSocket1Error(TObject *Sender,
TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
StatusBar1->SimpleText = "錯誤:無法連線" Socket->RemoteHost " Port :" Socket->RemotePort ;
ErrorCode = 0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ClientSocket1Disconnect(TObject *Sender,
TCustomWinSocket *Socket)
{
StatusBar1->SimpleText = "現在中斷" Socket->RemoteHost "連線" ;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ClientSocket1Read(TObject *Sender,
TCustomWinSocket *Socket)
{
MYPACK mp;
Socket->ReceiveBuf(&mp, sizeof(MYPACK)); AnsiString sz=(AnsiString)mp.szHeader; AnsiString ClientMessage = "RecievedLength=" IntToStr(mp.dwThisDataSize) ;
Socket->SendText("RecievedLength=" IntToStr(mp.dwThisDataSize) );//回報接收結果給Server StatusBar1->SimpleText = "現在正與" Socket->RemoteHost "連線 目前圖片" mp.szFileName;
char szz[256]={0};
// sprintf(szz, "%s %s %d %d %d %d",mp.szHeader,mp.szFileName,mp.dwPackTotal,mp.dwPackCount,mp.dwTotalDataSize,mp.dwThisDataSize);
AnsiString mes = "Client端送出訊息:RecievedLength=" IntToStr(mp.dwThisDataSize) ;
sprintf(szz,"%s",mes);
OutputDebugStringA(szz);
}
//--------------------------------------------------------------------------- 發表人 - danielj 於 2003/07/30 11:34:48