บทความนี้จะอธิบายขั้นตอนการใช้งานวิธีถ่ายโอนไฟล์โทรจันภายใต้ Delphi ในรูปแบบของตัวอย่าง ดังนี้
รหัสฝั่งเซิร์ฟเวอร์:
หน่วย ServerFrm; อินเทอร์เฟซ Windows, ข้อความ, SysUtils, ตัวแปร, คลาส, กราฟิก, การควบคุม, แบบฟอร์ม, กล่องโต้ตอบ, ComCtrls, StdCtrls, ExtCtrls, WinSock; พิมพ์ TfrmMain = class (TForm) Panel1: TPanel; Label1: TLabel; : TPanel; สตาบาร์: TStatusBar; TSaveDialog; btnListen: TButton; btnReceive: TButton; btnExit: TButton; ขั้นตอน FormCreate (ผู้ส่ง: TObject); ผู้ส่ง: TObject); btnReceiveClick (ผู้ส่ง: TObject); ขั้นตอน btnStopClick (ผู้ส่ง: TObject); ส่วนตัว { ประกาศส่วนตัว } สาธารณะ { ประกาศสาธารณะ } StopTrans: Boolean; // ไม่ว่าจะหยุดการส่ง switchInTrans: Boolean; :TSocket; / /กำหนดตัวจัดการซ็อกเก็ตบนฝั่งเซิร์ฟเวอร์//กระบวนการที่กำหนดเองเพื่อรับไฟล์ขั้นตอน RecvFile(FileName:String); end;var frmMain: TfrmMain;const BlockLen=1024*4;การดำเนินการ {$R *.dfm} ขั้นตอน tfrmmain.RecvFile(FileName:String);var Ftrans:file of Byte; Recelen:Integer; Blockbuf:array[0..BlockLen-1] of ไบต์; RecvSocket:TSocket; ra_len:integer;begin ra_len:=sizeof(ra); Recvsocket:=accept(server,@ra,@ra_len); มอบหมายไฟล์(Ftrans,ชื่อไฟล์); :=recv(recvsocket,Blockbuf,BlockLen,0); ในขณะที่ (recelen>0) และ (ไม่ใช่ StopTrans) จะเริ่มต้น BlockWrite(Ftrans,Blockbuf[0],BlockLen); application.ProcessMessages; recelen:=recv(recvsocket,Blockbuf,Blocklen,0); =เท็จ; MessageBox(จัดการ,'หยุดการส่ง!','พร้อมท์',MB_OK); EXIT; END; END; // ปิดไฟล์ ได้รับ SOCKET CloseFile(Ftrans); Closesocket(recvsocket); ,MB_OK) อย่างอื่น กล่องข้อความ (จัดการ, 'ไคลเอนต์ปิดการเชื่อมต่อ 1 ไฟล์อาจถูกถ่ายโอน!', 'พร้อมท์', MB_OK); สิ้นสุด; ขั้นตอน TfrmMain.FormCreate (ผู้ส่ง: TObject); var aWSAData: TWSAData; เริ่มต้นถ้า WSAStartup ($ 0101 ,aWSAData)<>0 จากนั้นยก Exception.Create('ไม่สามารถเริ่ม WinSock ไดนามิกลิงก์ไลบรารี'); messageBox (Handle, aWSAdata.szDescription, 'เวอร์ชันไลบรารีลิงก์แบบไดนามิกของ WinSock', mb_ok); end; ขั้นตอน TfrmMain.btnExitClick (ผู้ส่ง: TObject); เริ่มปิด; สิ้นสุด; ขั้นตอน TfrmMain.FormClose (ผู้ส่ง: TObject; var Action: TCloseAction) ;เริ่มต้นถ้า InTrans แล้วถ้า MessageBox(จัดการ,'กำลังรับไฟล์, หยุด? ','Prompt',MB_YESNO)=IDNO จากนั้นจะยกเลิก หาก SERVER<>INVALID_SOCKET แล้ว CLOSESOCKET(SERVER); // ปล่อยทรัพยากรที่สร้างโดยไลบรารีลิงก์แบบไดนามิกของ winsock หาก WSACleanup<>0 แล้วตามด้วยกล่องข้อความ (จัดการ 'ล้าง Winsock' ข้อผิดพลาดไลบรารีลิงก์แบบไดนามิก! ', 'พร้อมท์', MB_OK) อื่น ๆ กล่องข้อความ (จัดการ 'ล้างไลบรารีลิงก์แบบไดนามิกของ Winsock สำเร็จ!', 'พร้อมท์', MB_OK); ปลาย; ขั้นตอน TfrmMain.btnListenClick (ผู้ส่ง: TObject); var ca: SOCKADDR_IN; เริ่ม // สร้างเซิร์ฟเวอร์ SOCKET ฝั่งเซิร์ฟเวอร์: = ซ็อกเก็ต ( PF_INET,SOCK_STREAM,IPPROTO_IP); หากเซิร์ฟเวอร์=invalid_socket ให้เริ่ม stbar.SimpleText :='สร้างและรับ SOCKET error 1'; exit; //bind server-side SOCKET :=PF_INET; CA.sin_port :=htons(trim(edtPort.Text ))); S_addr :=INADDR_ANY; ถ้าbind(server,ca,sizeof(ca))=socket_error ให้เริ่ม stbar.SimpleText :='การผูกซ็อกเก็ตผิดพลาด โปรดเปลี่ยนพอร์ตการรับ'; closeSocket(server); exit; end else stbar.SimpleText :='การผูกซ็อกเก็ตการรับสำเร็จ!'; เปิดใช้งาน :=False; btnstop.Enabled :=true;end;procedure TfrmMain.btnReceiveClick(Sender: TObject);begin if (server=INVALID_SOCKET) จากนั้นให้เริ่ม MESSAGEBOX(HANDLE,'Not Listen, please Listen First!','Prompt',MB_OK); END; IF SaveDialog.Execute THEN RECVFILE(SaveDialog.FileName); end;procedure TfrmMain. btnStopClick(ผู้ส่ง: TObject);begin STOPTRANS:=TRUE; IF SERVER<>INVALID_SOCKET แล้ว cLOSESOCKET(SERVER); //Server:=INVALID_SOCKET จำเป็นต้องระบุที่นี่;
รหัสลูกค้า:
หน่วย ClientFrm; อินเทอร์เฟซ Windows, ข้อความ, SysUtils, ตัวแปร, คลาส, กราฟิก, การควบคุม, แบบฟอร์ม, กล่องโต้ตอบ, StdCtrls, ComCtrls, WinSock; พิมพ์ TfrmMain = class (TForm) opendfile: TOpenDialog; Label1: TLabel; Label2: TLabel ; edtPort: TEdit; StatusBar: TStatusBar; btnConnect: TProgressBar; ขั้นตอน FormCreate (ผู้ส่ง: TObject); btnConnectClick(ผู้ส่ง: TObject); btnSendClick (ผู้ส่ง: TObject); ขั้นตอน btnStopClick (ผู้ส่ง: TObject); ส่วนตัว { ประกาศส่วนตัว } ไคลเอนต์: TSocket; สาธารณะ { ประกาศสาธารณะ } StopTrans: Boolean; // ไม่ว่าจะหยุดส่ง developmentInTrans: Boolean; อยู่ระหว่างดำเนินการ ขั้นตอนของไฟล์ TransFile(FileName:String); //กระบวนการถ่ายโอนไฟล์สิ้นสุด; const BlockLen=1024*4; //จำนวนข้อมูลที่ส่งสูงสุดในแต่ละครั้ง frmMain: TfrmMain; การใช้งาน {$R *.dfm} ขั้นตอน TfrmMain.TransFile (ชื่อไฟล์: String); // กระบวนการถ่ายโอนไฟล์ var Ftrans: ไฟล์ของ Byte; BlockNum, RemainLen: integer; 0 ..BlockLen-1] ของ Byte; i:integer; SendLen:Integer;begin มอบหมายไฟล์ (Ftrans, ชื่อไฟล์); Flen: = FileSize (Ftrans); =True; SendLen:=1; สำหรับ i:=0 ถึง BlockNum-1 จะเริ่มต้นถ้า (StopTrans) หรือ (SendLen<=0) จากนั้น BlockRead(Ftrans,Blockbuf[0],SendLen:=Send(Client,Blockbuf,BlockLen,0); จากนั้นเริ่ม CloseFile(Ftrans); InTrans:=False; StatusBar.SimpleText :=''; MessageBox(Handle,'Stop Transmission!','Prompt',mb_ok); แถบความคืบหน้า:=0; จบ; :=''; กล่องข้อความ (จัดการ, 'การสิ้นสุดที่ผิดปกติ!', 'พร้อมท์', MB_OK); จากนั้นเริ่ม BlockRead(Ftrans,BlockBuf[0],RemainLen); SendLen:=send(client,BlockBuf,Remainlen,0); if (sendLen<=0) ให้เริ่ม closeFile(Ftrans); InTrans:=False; :=''; messagebox(handle,'การส่งข้อมูลสิ้นสุดลงอย่างผิดปกติ!','Prompt',mb_ok); end; end;progressBar.Position :=ProgressBar.Max ; CloseFile(Ftrans); ตำแหน่ง :=0;end;procedure TfrmMain.FormCreate(Sender: TObject);var aWSAData:TWSAData;begin if WSAStartup($0101,aWSAData)<>0 จากนั้นยก Exception.Create('ไม่สามารถเริ่ม WinSock ไดนามิกลิงก์ไลบรารี'); messageBox(Handle,aWSAdata.szDescription,'WinSock dynamic link Library version',mb_ok);end;procedure TfrmMain.btnExitClick (ผู้ส่ง: TObject);เริ่มปิด;สิ้นสุด;ขั้นตอน TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);เริ่มต้นถ้า InTrans แล้วถ้า MessageBox(จัดการ,'กำลังส่งไฟล์, หยุด? ','Prompt',MB_YESNO)=IDNO จากนั้นจะยกเลิก; //ปล่อยทรัพยากรที่สร้างโดยไลบรารีลิงก์แบบไดนามิกของ winsock ถ้า WSACleanup<>0 แล้วตามด้วยกล่องข้อความ (จัดการ,'ล้างข้อผิดพลาดไลบรารีลิงก์แบบไดนามิกของ Winsock!','พร้อมท์',MB_OK) กล่องข้อความ ELSE (จัดการ 'ล้างไลบรารีลิงก์แบบไดนามิกของ Winsock สำเร็จ!', 'พร้อมท์', MB_OK); CloseSocket (ไคลเอนต์); สิ้นสุด; ขั้นตอน TfrmMain.btnConnectClick(Sender: TObject);var ca:SOCKADDR_IN; hostaddr:u_long;begin Client:=Socket(PF_INET,SOCK_STREAM,IPPROTO_IP); IF CLIENT=INVALID_SOCKET ให้เริ่ม StatusBar.SimpleText :='สร้าง COSKET สำหรับเชื่อมต่อกับรีโมท ข้อผิดพลาดของเซิร์ฟเวอร์!'; จบ; :=PF_INET; CA.sin_port :=HTONS(STRTOINT(TRIM(EDTpORT.Text ))); HOSTADDR:=INET_ADDR(PCHAR(TRIM(EDTIP.Text ))); // ตัดสินว่า IP นั้นถูกกฎหมายหรือไม่ (hostaddr= -1 ) จากนั้นเริ่มต้น StatusBar.SimpleText :='Host IP address:'+trim(edtip.Text)+'Error'; exit; ca.sin_addr.S_addr :=hostaddr; // เชื่อมต่อกับเซิร์ฟเวอร์หากเชื่อมต่อ (Client,ca,sizeof(ca))<>0 จากนั้นเริ่ม StatusBar.SimpleText :='SOCKET เกิดข้อผิดพลาดในการเชื่อมต่อกับเซิร์ฟเวอร์!'; else StatusBar. SimpleText :='เชื่อมต่อกับ SOCKET ระยะไกลเรียบร้อยแล้ว!';end;procedure TfrmMain.btnSendClick(Sender: TObject);begin if (opendfile.Execute ) และ (FileExists(opendfile.FileName )) จากนั้น transFile(opendfile.FileName );end;procedure TfrmMain.btnStopClick(Sender: TObject);begin Stoptrans:=True;end;end