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 = "未定义请求"; } } //---------------------------------------------------------------------------