이 문서에서는 델파이에서 트로이 목마 파일 전송 방법의 구현 프로세스를 예제 형식으로 설명합니다.
서버 측 코드:
단위 ServerFrm;인터페이스는 Windows, 메시지, SysUtils, 변형, 클래스, 그래픽, 컨트롤, 양식, 대화 상자, ComCtrls, StdCtrls, ExtCtrls,WinSock;type TfrmMain = class(TForm) Panel1: TPanel: TLabel: TEdit; : TPanel; TStatusBar; TSaveDialog; btnReceive: TButton; btnExit: TButton; 프로시저 FormCreate(Sender: TObject); 프로시저 FormClose(Sender: TObject; var Action: TCloseAction) 송신자: TObject); btnReceiveClick(Sender: TObject); 프로시저 btnStopClick(Sender: TObject); private { Private 선언 } Public 선언 } StopTrans:Boolean; //전송 중지 여부를 나타냅니다. //파일이 수신되고 있음을 나타냅니다. :TSocket; / /서버 측에서 소켓 핸들을 정의합니다. //파일을 수신하기 위한 사용자 정의된 프로세스입니다. Procedure RecvFile(FileName:String) end;var frmMain: TfrmMain;const BlockLen=1024*4;implementation{$R *.dfm}프로시저 tfrmmain.RecvFile(FileName:String);var Ftrans:file of Byte; Blockbuf:array[0..BlockLen-1] 바이트; RecvSocket:TSocket; ra_len:integer;begin ra_len:=sizeof(ra); Recvsocket:=accept(server,@ra,@ra_len); rewrite(ftrans); intrans:=true :=recv(recvsocket,Blockbuf,BlockLen,0); while (recelen>0) 및 (not StopTrans) start BlockWrite(Ftrans,Blockbuf[0],BlockLen); recelen:=recv(recvsocket,Blockbuf,Blocklen,0); stoptrans가 시작되면 CloseSocket(RecvTrans); =False;MessageBox(처리,'전송 중지!','프롬프트',MB_OK); EXIT; END; //파일을 닫습니다. SOCKET CloseFile(Ftrans); InTrans:=False; if (Recelen=SOCKET_ERROR) then messagebox(handle,'전송이 비정상적으로 종료되었습니다.' ,MB_OK) ELSE 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;procedure TfrmMain.btnExitClick(Sender: TObject);begin Close;end;procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction) ;InTrans이면 시작하고 if MessageBox(handle,'파일 수신 중, 중지하시겠습니까? ','Prompt',MB_YESNO)=IDNO then abort; IF SERVER<>INVALID_SOCKET THEN CLOSESOCKET(SERVER); //WSACleanup<>0이면 Winsock 동적 링크 라이브러리에서 생성된 리소스를 해제합니다. 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); server=invalid_socket이면 stabar.SimpleText를 시작합니다. :='SOCKET 오류 1 생성 및 수신'; end; //서버측 SOCKET ca.sin_family :=PF_INET; CA.sin_port :=htons(strtoint(trim(edtPort.Text ))); . S_addr :=INADDR_ANY; 바인딩(server,ca,sizeof(ca))=socket_error이면 Stabar.SimpleText를 시작합니다. :='소켓 바인딩 오류입니다. 수신 포트를 변경하세요.'; closeSocket(server); end else stabar.SimpleText :='수신 소켓 바인딩을 성공적으로 완료했습니다!'; 활성화됨 :=False; btnstop.Enabled :=true;end;절차 TfrmMain.btnReceiveClick(Sender: TObject); 시작 (서버=INVALID_SOCKET) THEN BEGIN MESSAGEBOX(HANDLE,'아직 듣지 않았습니다. 먼저 들어보세요!','Prompt',MB_OK); EXIT; IF SaveDialog.Execute THEN RECVFILE(SaveDialog.FileName) end;procedure TfrmMain. btnStopClick(Sender: TObject);시작 STOPTRANS:=TRUE; IF SERVER<>INVALID_SOCKET THEN cLOSESOCKET(SERVER); //Server:=INVALID_SOCKET을 여기에 명시해야 합니다. bTNSTOP.Enabled :=TRUE;end;end.
클라이언트 코드:
단위 ClientFrm;인터페이스는 Windows, 메시지, SysUtils, 변형, 클래스, 그래픽, 컨트롤, 양식, 대화 상자, StdCtrls, ComCtrls, WinSock; 유형 TfrmMain = class(TForm) opendfile: TOpenDialog: TLabel: TLabel; ;edtPort: TEditBar: TStatusBar; btnConnect: TButton: TButton; btnExit: TButton; ProgressBar: TProgressBar; 프로시저 btnExitClick(Sender: TObject); 프로시저 btnConnectClick(Sender: TObject); btnSendClick(Sender: TObject); 절차 btnStopClick(Sender: TObject); private { Private 선언 } Client:TSocket; public { Public 선언 } StopTrans:Boolean; //전송 중지 여부를 나타냅니다. 진행 중 File Procedure TransFile(FileName:String); //파일 전송 과정 end; const BlockLen=1024*4; //1회 전송되는 최대 데이터 양 var frmMain: TfrmMain;implementation{$R *.dfm}procedure TfrmMain.TransFile(FileName:String); //파일 전송 프로세스 var Ftrans:file of Byte; BlockNum,RemainLen:integer; 0 ..BlockLen-1] of Byte; SendLen:Integer;시작 할당파일(Ftrans,파일이름); 재설정(Ftrans); BlockNum:=Flen div BlockLen:=1+BlockNum;=Flen mod BlockLen; =True; i:=0의 경우 BlockNum-1인 경우 (StopTrans) 또는 (SendLen<=0) then Break; SendLen:=Send(Client,Blockbuf,BlockLen,0); Application.processMessages; 그런 다음 CloseFile(Ftrans)을 시작합니다. InTrans:=False; StatusBar.SimpleText :=''; MessageBox(Handle,'Prompt',mb_ok); Progressbar.Position :=0; end; if (SendLen<=0) then start CloseFile(Ftrans); :=''; messagebox(handle,'비정상 종료 중입니다!','Prompt',MB_OK); ProgressBar.Position :=0 end; 그런 다음 BlockRead(Ftrans,BlockBuf[0],RemainLen); SendLen:=send(client,BlockBuf,Remainlen,0); if (sendLen<=0) 다음 InTrans:=False; :=''; messagebox(handle,'전송이 비정상적으로 종료되었습니다!','Prompt',mb_ok); ProgressBar.Position :=0; end; processBar.Position :=ProgressBar.Max ; InTrans:=False; StatusBar.SimpleText :=''; messagebox(handle,'Prompt',mb_ok); 위치 :=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인 경우 시작하고 if MessageBox(handle,'파일 전송 중, 중지하시겠습니까? ','Prompt',MB_YESNO)=IDNO then abort; //WSACleanup<>0인 경우 Winsock 동적 링크 라이브러리에서 생성된 리소스를 해제합니다. messagebox(handle,'Clear Winsock 동적 링크 라이브러리 오류!','Prompt',MB_OK) ELSE messagebox(handle,'Winsock 동적 링크 라이브러리를 성공적으로 지웠습니다!','프롬프트',MB_OK);end;procedure 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 생성 서버 오류!'; 종료; :=PF_INET; CA.sin_port :=HTONS(STRTOINT(TRIM(EDTpORT.Text )))); HOSTADDR:=INET_ADDR(PCHAR(TRIM(EDTIP.Text ))); //IP가 유효한지 판단합니다. -1 ) then start StatusBar.SimpleText :='호스트 IP 주소:'+trim(edtip.Text)+'Error'; 종료 else; ca.sin_addr.S_addr :=hostaddr; //connect(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.