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::btnConnectMessageClick(TObject *Sender) 
{ 
	// 连接通讯服务Socket 
	csMessage->Host = edHost->Text; 
	csMessage->Port = StrToInt(edPort->Text); 
	csMessage->Active = true; 
} 
//--------------------------------------------------------------------------- 
void __fastcall TForm1::btnSendRequestClick(TObject *Sender) 
{ 
	TOpenDialog *dlg = new TOpenDialog(this); 
 
	if (dlg->Execute()) 
	{ 
		SendFileName = dlg->FileName; 
		edFrom->Text = SendFileName; 
		SendFileStream = new TFileStream(SendFileName, fmOpenRead); 
		SendFileSize = SendFileStream->Size; 
	} 
	delete dlg; 
 
	// 发送传输请求 
	// 格式: 信息头(1位) + 文件名 + ":" + 文件大小 
	csMessage->Socket->SendText(IntToStr(mtRequestTransmission) + ExtractFileName(SendFileName) + ":" + IntToStr(SendFileSize)); 
} 
//--------------------------------------------------------------------------- 
void __fastcall TForm1::csMessageError(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::csMessageConnect(TObject *Sender, 
	  TCustomWinSocket *Socket) 
{ 
	// 连接通讯服务Socket成功后向其发送传输文件请求 
	StatusBar1->Panels->Items[0]->Text = "成功连接通讯Socket"; 
	btnSendRequest->Enabled = true; 
} 
//--------------------------------------------------------------------------- 
void __fastcall TForm1::csMessageRead(TObject *Sender, 
      TCustomWinSocket *Socket) 
{ 
	// 接收来自服务器的回应 
	AnsiString Receive = Socket->ReceiveText(); 
	// 分离收到的信息 
	int HeadInfo = Receive.SubString(1, 1).ToInt(); 
	int ColonPos = Receive.Pos(":"); 
	AnsiString tmpReceiveFileName = Receive.SubString(2, ColonPos - 2); 
	__int64 tmpReceiveFileSize = Receive.SubString(ColonPos + 1, Receive.Length()).ToInt(); 
 
	switch (HeadInfo) 
	{ 
	case mtConfirmRequestTransmission: // 确认文件传输请求 
		if (tmpReceiveFileName == ExtractFileName(SendFileName) 
			&& tmpReceiveFileSize == SendFileSize) 
		{ 
			StatusBar1->Panels->Items[0]->Text = "服务器正确回应传输文件请求"; 
 
			// 打开传输文件Socket 
			csTransmission->Host = edHost->Text; 
			csTransmission->Port = StrToInt(edPort2->Text); 
			csTransmission->Open(); 
		} 
		else 
			StatusBar1->Panels->Items[0]->Text = "服务器回应传输文件请求有错误"; 
		break; 
 
	default: // 未定义请求 
		StatusBar1->Panels->Items[0]->Text = "未定义请求"; 
	} 
} 
//--------------------------------------------------------------------------- 
void __fastcall TForm1::csTransmissionConnect(TObject *Sender, 
      TCustomWinSocket *Socket) 
{ 
	StatusBar1->Panels->Items[0]->Text = "成功连接传输服务Socket,开始传输..."; 
	csTransmission->Socket->SendStream(SendFileStream); 
} 
//--------------------------------------------------------------------------- 
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose) 
{ 
	csMessage->Close(); 
	csTransmission->Close();	 
} 
//--------------------------------------------------------------------------- 
void __fastcall TForm1::csTransmissionRead(TObject *Sender, 
      TCustomWinSocket *Socket) 
{ 
	// 接收来自服务器的回应 
	AnsiString Receive = Socket->ReceiveText(); 
	int HeadInfo = Receive.SubString(1, 1).ToInt(); 
	AnsiString BodyInfo = Receive.SubString(2, Receive.Length()); 
 
	switch (HeadInfo) 
	{ 
	case mtTransmissionCompleted: 
		StatusBar1->Panels->Items[0]->Text = "服务器完成文件接收"; 
		break; 
 
	default: 
		StatusBar1->Panels->Items[0]->Text = "未定义请求"; 
	} 
} 
//---------------------------------------------------------------------------