완전한 것은 아니구 원하는 기능만 들어가는
ftp server를 구현하려고 합니다.
Indy의 현재 9.0베타 버젼을 보니 Ftp Server 콤포넌트가 있어
이 놈을 사용해서 코딩하고 있습니다.
접속이나 업로드, 다운은 되는데
리스트를 뿌려주는 부분에서 애를 먹고 있습니다.
server 콤포넌트의 OnListDirectory 이벤트에서
디렉토리의 파일들 정보를 TIdFTPListItems에 넣어주는 기능을 넣었는데
제대로 작동을 하지 않습니다.
외부의 클라이언트로 접속하여 'ls'를 치면
**************************************
ftp> ls
200 PORT Command successful.
226 Closing data connection.
ftp> ls
125 File status okay; about to open data connection.
ftp> ls
200 PORT Command successful.
200 PORT Command successful.
ftp> ls
226 Closing data connection.
125 File status okay; about to open data connection.
drw-rw-r-- 1 xxx xxx 512 Feb 02 09:29 xxxx
200 PORT Command successful.
ftp>
**************************************
와 같이 여러 번 'ls'를 쳐야 겨우 결과가 나오고
그나마 윈도우의 기본 ftp 클라이언트를 사용하면
**************************************
ftp> ls
200 PORT Command successful.
226 Closing data connection.
ftp> ls
125 File status okay; about to open data connection.
ftp> ls
200 PORT Command successful.
200 PORT Command successful.
ftp> ls
426 Data connection closed abnormally.
ftp>
**************************************
처럼 아예 결과를 보지도 못합니다.
Indy의 FTP Server 콤포넌트 사용해보신 부 도움 부탁드립니다.
저는 C++빌더를 사용하는데,
현재 빌더에서는 9.0.3을 사용할 수 없습니다.
컴파일할 때 에러가 발생하는데
다른 분들도 해결하지 못하고 계신듯 합니다.
혹시 빌더에서 9.0.3 사용하시는 분은 팁 좀 올려주세요.
암튼...
문제는 인디 소스에 있더군요.
IdFTPServer.pas 파일을 보면,
1320, 1321라인을 보면
ASender.Reply.SetReply(125, RSFTPDataConnToOpen);
FDataChannelThread.StartThread(ftpRetr);
이렇게 돼 있는데, 그 사이에 다음
ASender.SendReply;
를 삽입하면 문제가 해결되더군요.
9.0.3에서는 이미 추가 되었구요.
이만...