この記事では、Delphi でのトロイの木馬ファイル転送メソッドの実装プロセスを例の形式で説明します。
サーバー側のコード:
ユニット ServerFrm; インターフェイスは Windows、メッセージ、SysUtils、バリアント、クラス、グラフィックス、コントロール、フォーム、ダイアログ、ComCtrls、StdCtrls、ExtCtrls、WinSock を使用します。タイプ TfrmMain = class(TForm) パネル 1: TPanel; edtPort: TEdit ; : TPanel; スタバー: TStatusBar; TSaveDialog; btnListen: TButton; btnExit: TButton; プロシージャ FormCreate(Sender: TObject); プロシージャ FormClose(Sender: TObject);送信者: TObject); btnReceiveClick(Sender: TObject); process btnStopClick(Sender: TObject); private { プライベート宣言 } public { パブリック宣言 } // 送信を停止するかどうか switchInTrans:Boolean; :TSocket; / /サーバー側でソケットハンドルを定義します//ファイルを受信するためのカスタマイズされたプロセスprocedure RecvFile(FileName:String); TfrmMain;const BlockLen=1024*4;実装{$R *.dfm}プロシージャ tfrmmain.RecvFile(FileName:String);var Ftrans:byte のファイル; Recelen:Integer:array[0..BlockLen-1]バイト; RecvSocket:TSocket; ra_len:integer; 開始 ra_len:=sizeof(ra); assignFile(Ftrans,@ra_len); :=recv(recvsocket,Blockbuf,BlockLen,0); while (recelen>0) および (not) StopTrans) do begin BlockWrite(Ftrans,Blockbuf[0],BlockLen); recelen:=recv(recvsocket,Blockbuf,Blocklen,0); stoptrans の場合は CloseFile(Ftrans); =False; MessageBox(ハンドル,'送信を停止!','プロンプト',MB_OK); EXIT; END; //SOCKET を閉じます CloseFile(Ftrans); if (Recelen=SOCKET_ERROR) then messagebox(handle,'送信が異常終了しました!' 、MB_OK) ELSE MESSAGEBOX(HANDLE,'クライアントは接続 1 を閉じました。ファイルは転送された可能性があります!','プロンプト',MB_OK);end;procedure 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) ;begin if InTrans then if MessageBox(handle,'ファイルの受信中、停止しますか? ','Prompt',MB_YESNO)=IDNO then abort; IF SERVER<>INVALID_SOCKET THEN CLOSESOCKET(SERVER); //winsock ダイナミック リンク ライブラリによって作成されたリソースを解放します if WSACleanup<>0 then messagebox(handle,'Winsock をクリアします)ダイナミック リンク ライブラリ エラー! ','プロンプト',MB_OK) ELSE 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 の作成と受信'; //サーバー側 SOCKET のバインド :=PF_INET :=htons(trim(edtPort.Text )); S_addr :=INADDR_ANY;bind(server,ca,sizeof(ca))=socket_error の場合は、stabar.SimpleText を開始します。 :='バインディングソケットエラー、受信ポートを変更してください'; closeSocket(server); exit elsestabar.SimpleText :='受信ソケットのバインドが成功しました!' // listen(server,5);有効 :=False; btnstop.Enabled :=true;end;プロシージャ TfrmMain.btnReceiveClick(Sender: TObject);begin if (server=INVALID_SOCKET) THEN BEGIN MESSAGEBOX(HANDLE,'まだ聞いていません。最初に聞いてください!','プロンプト',MB_OK); IF SaveDialog.Execute THEN RECVFILE(SaveDialog.FileName); end; btnStopClick(送信者: TObject);開始STOPTRANS:=TRUE; IF SERVER<>INVALID_SOCKET THEN cLOSESOCKET(SERVER); //Server:=INVALID_SOCKET をここに指定する必要があります。
クライアントコード:
ユニット ClientFrm; インターフェイスは Windows、メッセージ、SysUtils、バリアント、クラス、グラフィックス、コントロール、フォーム、ダイアログ、StdCtrls、ComCtrls、WinSock を使用します; type TfrmMain = class(TForm) opendfile: TOpenDialog; Label1: TLabel: TEdit; ; edtポート: TEdit ステータスバー: TStatusBar; btnConnect: TButton; btnSend: TButton; btnExit: TProgressBar; プロシージャ FormCreate(Sender: TObject); プロシージャ FormClose(Sender: TObject); btnConnectClick(送信者: TObject); btnSendClick(Sender: TObject); プロシージャ btnStopClick(Sender: TObject); private { プライベート宣言 } Client:TSocket; public { パブリック宣言 } // 送信を停止するかどうかを示します。進行中 ファイル プロシージャ TransFile(FileName:String); //ファイル転送プロセスが終了します const BlockLen=1024*4; //毎回送信されるデータの最大量frmMain: TfrmMain;implementation{$R *.dfm}procedure TfrmMain.TransFile(FileName:String); // ファイルの転送処理 var Ftrans:file of Byte; 0 ..BlockLen-1] のバイト; SendLen:Integer; assignFile(Ftrans,filename); Flen:=FileSize(Ftrans); progressBar.Max :=1+BlockNum; =True; SendLen:=1; for i:=0 to BlockNum-1 do begin if (StopTrans) または(SendLen<=0) then Break; SendLen:=Send(Client,Blockbuf,BlockLen,0); if StopTrans次に、CloseFile(Ftrans) を開始します。 MessageBox(Handle,'送信を停止!','Prompt',mb_ok); progressbar.Position :=0 exit if (SendLen<=0) then begin CloseFile(Ftrans); :=''; メッセージボックス(ハンドル,'送信異常終了!','プロンプト',MB_OK); 終了Len>0;次に、BlockRead(Ftrans,BlockBuf[0],RemainLen); を開始します。SendLen:=send(client,BlockBuf,Remainlen,0); :=''; messagebox(handle,'送信が異常終了しました!','prompt',mb_ok); ; end; progressBar.Position :=ProgressBar.Max ; InTrans:=False; StatusBar.SimpleText :='';位置 :=0;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;procedure TfrmMain.btnExitClick (送信者: TObject);開始 閉じる;終了;手順TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);begin if InTrans then if MessageBox(handle,'ファイルの送信を停止しますか? ','Prompt',MB_YESNO)=IDNO then abort; //winsock ダイナミック リンク ライブラリによって作成されたリソースを解放 if WSACleanup<>0 then 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 THEN BEGIN StatusBar.SimpleText :='リモートに接続するための COSKET を作成しますサーバーエラー!'; ca.sin_family を終了します。 :=PF_INET; CA.sin_port :=HTONS(STRTOINT(TRIM(EDTpORT.Text ))); //IP が正当かどうかを判断します (hostaddr=) -1 ) then begin StatusBar.SimpleText :='ホスト IP アドレス:'+trim(edtip.Text)+'Error exit else'; ca.sin_addr.S_addr :=hostaddr; //サーバーに接続します if connect(Client,ca,sizeof(ca))<>0 then begin StatusBar.SimpleText :='サーバーへの接続中に SOCKET エラーが発生しました!'; else StatusBar.SimpleText :='リモート SOCKET に正常に接続しました!';end;プロシージャ 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。