توضح هذه المقالة عملية تنفيذ طريقة نقل ملفات طروادة ضمن دلفي في شكل أمثلة، والخطوات المحددة هي كما يلي:
رمز جانب الخادم:
وحدة ServerFrm؛ تستخدم واجهات Windows، والرسائل، وSysUtils، والمتغيرات، والفئات، والرسومات، وعناصر التحكم، والنماذج، ومربعات الحوار، وComCtrls، وStdCtrls، وExtCtrls، وWinSock؛ : TPanel؛ TSaveDialog: TButton; btnReceive: TButton; btnStop: TButton; btnExit: TButton; الإجراء btnExitClick(Sender: TObject); المرسل: الإجراء TObject). btnReceiveClick(Sender: TObject); الإجراء btnStopClick(Sender: TObject); public { الإعلانات العامة } StopTrans:Boolean; :TSocket // تحديد مقبض المقبس على جانب الخادم // إجراء عملية مخصصة لتلقي الملفات RecvFile(FileName:String end;var frmMain: TfrmMain;const BlockLen=1024*4;إجراءات التنفيذ{$R *.dfm} tfrmmain.RecvFile(FileName:String);var Ftrans:file of Byte; بايت؛ ra_len:integer;begin ra_len:=sizeof(ra);=accept(server,@ra,@ra_len); :=recv(recvsocket,Blockbuf,BlockLen,0); while (recelen>0) and (not StopTrans) ابدأ BlockWrite(Ftrans,Blockbuf[0],BlockLen); recelen:=recv(recvsocket,Blockbuf,Blocklen,0); =FalseMessageBox(Handle,'Stop Transmission!','Prompt',MB_OK); EXIT END; // أغلق الملف، تم استلامه SOCKET CloseFile(Ftrans); InTrans:=False; ،MB_OK) آخر MESSAGEBOX(HANDLE,'لقد أغلق العميل الاتصال 1، ربما تم نقل الملف!','Prompt',MB_OK);end; الإجراء TfrmMain.FormCreate(Sender: TObject);var aWSAData:TWSAData;begin if WSAStartup($0101) ,aWSAData)<>0 ثم ارفع Exception.Create('لا يمكن بدء مكتبة الارتباط الديناميكي WinSock'); messageBox(Handle,aWSAdata.szDescription,'إصدار مكتبة الارتباط الديناميكي WinSock',mb_ok);end;إجراء TfrmMain.btnExitClick(Sender: TObject);begin Close;end;إجراء TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction) ؛ ابدأ إذا كان InTrans ثم إذا كان messageBox(مقبض،"استلام الملفات، توقف؟" ','Prompt',MB_YESNO)=IDNO ثم abort; IF SERVER<>INVALID_SOCKET THEN CLOSESOCKET(SERVER); خطأ في مكتبة الارتباط الديناميكي '،'موجه'،MB_OK) آخر messagebox(handle,'مسح مكتبة الارتباط الديناميكي Winsock بنجاح!','Prompt',MB_OK);end;procedure TfrmMain.btnListenClick(Sender: TObject);var ca:SOCKADDR_IN;begin // إنشاء SOCKET Server من جانب الخادم:=Socket ( PF_INET,SOCK_STREAM,IPPROTO_IP); إذا كان الخادم = invalid_socket ثم ابدأ بـstabar.SimpleText :='خطأ في إنشاء SOCKET 1'; end; S_addr :=INADDR_ANY; إذا كان bind(server,ca,sizeof(ca))=socket_error فابدأ بـstabar.SimpleText. :='خطأ في ربط المقبس، يرجى تغيير منفذ الاستقبال'; CloseSocket(server); end else Stabar.SimpleText :='تم ربط مقبس الاستقبال بنجاح!'; Enabled :=False; btnstop.Enabled :=true;end;procedure TfrmMain.btnReceiveClick(Sender: TObject);begin if (server=INVALID_SOCKET) ثم ابدأ MESSAGEBOX(HANDLE,'لم تستمع بعد، يرجى الاستماع أولاً!','Prompt',MB_OK END; IF SaveDialog.Execute THEN RECVFILE(SaveDialog.FileName); btnStopClick(Sender: TObject);begin STOPTRANS:=TRUE; IF SERVER<>INVALID_SOCKET THEN cLOSESOCKET(SERVER); // يجب ذكر INVALID_SOCKET هنا;
رمز العميل:
وحدة ClientFrm؛ تستخدم واجهات Windows، والرسائل، وSysUtils، والمتغيرات، والفئات، والرسومات، وعناصر التحكم، والنماذج، ومربعات الحوار، وStdCtrls، وComCtrls، وWinSock؛ اكتب TfrmMain = class(TForm) opendfile: TOpenDialog; ; btnConnect: TButton; btnSend: TButton; btnStop: TButton; btnExit: TButton; الإجراء FormCreate(Sender: TObject); btnConnectClick(Sender: TObject); btnSendClick(Sender: TObject); الإجراء btnStopClick(Sender: TObject); الخاص { الإعلانات الخاصة } Client:TSocket; public { الإعلانات العامة } StopTrans:Boolean; إجراء الملف قيد التقدم TransFile(FileName:String); // تنتهي عملية نقل الملفات const BlockLen=1024*4; // الحد الأقصى لكمية البيانات المرسلة في كل مرة var frmMain: TfrmMain;implementation{$R *.dfm}procedure TfrmMain.TransFile(FileName:String); // عملية نقل الملفات var Ftrans:file of Flen:integer; 0 ..BlockLen-1] من البايت؛ setFile(Ftrans,filename); =True; SendLen:=1; for i:=0 to BlockNum-1 do begin if (StopTrans) or (SendLen<=0) ثم BlockRead(Ftrans,Blockbuf[0],BlockLen:=Send(Client,Blockbuf,BlockLen,0); ثم ابدأ CloseFile(Ftrans:=False; MessageBox(Handle,'Stop Transmission!','Prompt',mb_ok);progressbar.Position :=0 end; :=''; messagebox(handle,'إنهاء غير طبيعي للخارج!','Prompt',MB_OK);progressBar.Position :=0; end; ثم ابدأ BlockRead(Ftrans,BlockBuf[0],RemainLen);=send(client,BlockBuf,Remainlen,0); :=''; messagebox(handle,'تم إنهاء الإرسال بشكل غير طبيعي!','Prompt',mb_ok); end;progressBar.Position :=ProgressBar.Max ; CloseFile(Ftrans);=False; الموضع:=0;نهاية;الإجراء TfrmMain.FormCreate(Sender: TObject);var aWSAData:TWSAData;begin if WSAStartup($0101,aWSAData)<>0 ثم ارفع Exception.Create('لا يمكن بدء مكتبة الارتباط الديناميكي WinSock'); messageBox(Handle,aWSAdata.szDescription,'WinSock إصدار مكتبة الارتباط الديناميكي',mb_ok);end;procedure TfrmMain.btnExitClick (المرسل: TObject)؛ البدء؛ الإغلاق؛ النهاية؛ الإجراء TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);ابدأ إذا كان InTrans ثم إذا كان messageBox(handle,'Transmitting files, stop؟ ','Prompt',MB_YESNO)=IDNO ثم abort; // حرر الموارد التي أنشأتها مكتبة الارتباط الديناميكي Winsock إذا كان WSACleanup<>0 ثم messagebox(handle,'Clear Winsock خطأ في مكتبة الارتباط الديناميكي!','Prompt',MB_OK) ELSE messagebox(handle,'مسح مكتبة الارتباط الديناميكي Winsock بنجاح!','Prompt',MB_OK); 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 قانونيًا if (hostaddr= -1 ) ثم ابدأ StatusBar.SimpleText :='عنوان IP للمضيف:'+trim(edtip.Text)+'Error' end else; ca.sin_addr.S_addr :=hostaddr; // اتصل بالخادم إذا كان الاتصال (Client,ca,sizeof(ca))<>0 ثم يبدأ StatusBar.SimpleText :='خطأ SOCKET في الاتصال بالخادم!'; else StatusBar.SimpleText :='تم الاتصال بالمقبس البعيد بنجاح!';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.