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(); } //---------------------------------------------------------------------------