www.pudn.com > 一个利用VC Socket进行文件传输的例子.rar > Unit1.cpp


//--------------------------------------------------------------------------- 
 
#include  
#pragma hdrstop 
 
#include "Unit1.h" 
//--------------------------------------------------------------------------- 
#pragma package(smart_init) 
#pragma resource "*.dfm" 
TForm1 *Form1; 
//--------------------------------------------------------------------------- 
__fastcall TForm1::TForm1(TComponent* Owner) 
	: TForm(Owner) 
{ 
} 
//--------------------------------------------------------------------------- 
void __fastcall TForm1::btnStartupMessageClick(TObject *Sender) 
{ 
	// 启动通讯服务Socket 
	ssMessage->Port = StrToInt(edPort->Text); 
	ssMessage->Open(); 
} 
//--------------------------------------------------------------------------- 
void __fastcall TForm1::ssMessageListen(TObject *Sender, 
	  TCustomWinSocket *Socket) 
{ 
	StatusBar1->Panels->Items[0]->Text = "正在监听请求..."; 
} 
//--------------------------------------------------------------------------- 
void __fastcall TForm1::ssMessageClientRead(TObject *Sender, 
	  TCustomWinSocket *Socket) 
{ 
	// 接收来自客户机的请求 
	AnsiString Receive = Socket->ReceiveText(); 
	// 分离收到的信息 
	int HeadInfo = Receive.SubString(1, 1).ToInt(); 
	int ColonPos = Receive.Pos(":"); 
	ReceiveFileName = Receive.SubString(2, ColonPos - 2); 
	ReceiveFileSize = Receive.SubString(ColonPos + 1, Receive.Length()).ToInt(); 
 
	switch (HeadInfo) 
	{ 
	case mtRequestTransmission: // 请求传输文件 
		StatusBar1->Panels->Items[0]->Text = "请求传输文件: " + ReceiveFileName + ":" + ReceiveFileSize; 
 
		ReceiveFileStream = new TFileStream("H:\\temp\\" + ReceiveFileName, fmOpenWrite | fmCreate | fmShareExclusive); 
		Socket->SendText(IntToStr(mtConfirmRequestTransmission) + ReceiveFileName + ":" + IntToStr(ReceiveFileSize)); 
 
		// 打开接收文件Socket 
		ssTransmission->Port = StrToInt(edPort2->Text); 
		ssTransmission->Open(); 
		break; 
 
	default: // 未定义请求 
		StatusBar1->Panels->Items[0]->Text = "未定义请求"; 
	} 
} 
//--------------------------------------------------------------------------- 
void __fastcall TForm1::ssMessageClientError(TObject *Sender, 
	  TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode) 
{ 
	AnsiString msg; 
	switch (ErrorCode) 
	{ 
	case eeGeneral: 
		msg = "The socket received an error message that does not fit into any of the following categories."; 
		break; 
	case eeSend: 
		msg = "An error occurred when trying to write to the socket connection."; 
		break; 
	case eeReceive: 
		msg = "An error occurred when trying to read from the socket connection."; 
		break; 
	case eeConnect: 
		msg = "A connection request that was already accepted could not be completed."; 
		break; 
	case eeDisconnect: 
		msg = "An error occurred when trying to close a connection."; 
		break; 
	case eeAccept: 
		msg = "A problem occurred when trying to accept a client connection request."; 
		break; 
	default: 
		msg = "Unknown error!"; 
	} 
 
	ErrorCode = 0; 
	MessageBox(NULL, msg.c_str(), "错误", MB_OK | MB_ICONERROR); 
} 
//--------------------------------------------------------------------------- 
void __fastcall TForm1::ssTransmissionListen(TObject *Sender, 
      TCustomWinSocket *Socket) 
{ 
	StatusBar1->Panels->Items[0]->Text = "正在监听文件传输..."; 
} 
//--------------------------------------------------------------------------- 
void __fastcall TForm1::ssTransmissionClientRead(TObject *Sender, 
	  TCustomWinSocket *Socket) 
{ 
	void *pvBuf; 
	int ReceSize, RealSize; 
 
	ReceSize = Socket->ReceiveLength(); 
	pvBuf = malloc(ReceSize); 
	RealSize = Socket->ReceiveBuf(pvBuf, ReceSize); 
	ReceiveFileStream->Write(pvBuf, RealSize); 
 
	ReceiveLen += RealSize; 
	if (ReceiveLen == ReceiveFileSize) 
	{ 
		FileClose(ReceiveFileStream->Handle); 
		Socket->SendText(IntToStr(mtTransmissionCompleted) + "传输完毕"); 
		StatusBar1->Panels->Items[0]->Text = "文件接收完成"; 
	} 
	 
	free(pvBuf); 
} 
//--------------------------------------------------------------------------- 
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose) 
{ 
	ssMessage->Close(); 
	ssTransmission->Close(); 
} 
//---------------------------------------------------------------------------