Connection reset by peer: 10054는...
서버 측에서 특정한 사유로 연결을 끊었다는 뜻이다.
보다 정확히 말하면 서버에서 일방적으로 끊었다기 보다는,
특정한 이유가 발생되서 서버에서 현재의 연결을 재설정 해야만 했다는 뜻이다.
통상은 Client가...
1. 연결 후 장시간 아무런 동작을 하지 않거나
2. 파일 업로드/다운로드 시의 서버측 규약을 지키지 않았거나
3. Client가 갑자기 연결을 끊은 경우가 이에 해당한다.
1번의 경우는 단순히 재연결을 시도하면 되지만, 연결을 계속 유지해야만 하는 경우라면
주기적으로 서버 측에 패킷을 전달해 주면되는데, NATKeepAlive의 UseKeepAlive property를 True로 설정하여 준다.
NATKeepAlive 는 TIdFTPKeepAlive 객체로 유지여부 및 유휴, 패킷전송간격 등을 설정하도록 되어있다.
관련되 설명들을 보면 다음과 같다.(IdFTP.pas에서 KeepAlive로 검색하면 보다 다양한 정보를 얻을 수 있다.)
-- TIdFTPKeepAlive UseKeepAlive property 부분
be enabled on the command connection for its entire lifetime, not just during transfers,
and maybe also add an option to enable keepalives on the data connections as well...
-- TIdFTP.InitComponent 부분
Some firewalls don't handle control connections properly during long data transfers.
They will timeout the control connection because it is idle and making it worse is
that they will chop off a connection instead of closing it, causing TIdFTP to wait
forever for nothing.
2번의 경우 1번을 통해 대체로 해소가 되지만, 계속적으로 문제가 되는 경우라면 서버쪽의 제한 설정을 확인해야한다.
서버측에서 업다운로드 용량, 시간 등의 제약이 너무 타이트하다면 이를 조정할 필요가 있다.
3번의 경우는 Client에서 Abort로 현재 처리 명령을 강제 종료한 경우에 해당한다.
많은 파일을 업다운로드 시 로직 루프 내에 Flag를 두어 제어할 수도 있지만 Abort가 가장 즉각적으로 처리된다.
1~3이든 어떤 경우이던...
Connection reset by peer 오류가 발생되면 이후 처리가 비정상적이 되므로 재연결을 처리해야 한다.
디렉토리 이동, 파일업다운로드 등 명령 처리 전에 Connection 상태를 체크하여 끊어진 경우 재연결 처리해야 한다.
연결 여부를 확인하기 위해서는 Connected property 값을 체크하게 되는데
Connected는 단순히 상태값을 담고있는 Boolean이 아니라 내부적으로 Ftp명령을 통해 연결여부를 확인하는 로직으로 구성되어 있다. 따라서 Connection reset by peer 가 발생된 이후라면 Connected값을 확인하는 동안 오류가 발생되어 아무 것도 할 수 없게된다. Connected는 내부적으로 IOHandler를 이용하므로 먼저 이에 대한 처리가 필요하다.
다음과 같이 연결여부 확인 및 재연결 처리를 위한 보완로직을 작성하도록 하자.
// 연결여부 확인 함수
function CheckConnected: Boolean;
begin
Result := False;
try
Result := MyFtp.Connected;
except
//connection reset by peer가 발생되면 IOHander를 종료하고 연결을 끊는다
MyFtp.IOHandler.Close;
MyFtp.Disconnect;
end;
end;
// 연결이 끊겼다면 재연결하는 함수
function TMyForm.TryReconnect: Boolean;
begin
Result := False;
if not CheckConnected then
begin
//연결여부를 확인하여 끊겼으면 재연결한다.
MyFtp.Connect;
//Todo anythings to need...
Result := True;
end;
end;
procedure TMyForm.DownloadButtonClick(Sender: TObject);
begin
//모든 처리 전에 연결확인/재연결을 두자...
TryReconnect;
//Todo: processing such as downloading...
end;
IdFTP를 이용하더라도 다양한 FTP서버 환경에 대응되는 FTP 모듈을 만드는 건 쉽지않다.
AntiFreezing 처리...서버에 따른 Encoding처리...
FileZilla를 만든는 거랑 똑같으니...
시간이 된다면 IdFtp를 래핑하여 쓰기 쉽게 만든 TFtpEx 콤포넌트를 올려볼까나...
끝.
'DogFoot > Delphi' 카테고리의 다른 글
[Delphi] 윈도우11 - 트레이아이콘 더블클릭 시 폼을 화면 최상위로 표시하기 (0) | 2023.07.19 |
---|---|
[Delphi] 다중 예외 처리: 다중 Exception 객체 처리 (0) | 2022.12.22 |
[Delphi] 중첩 예외처리(try...except) (0) | 2021.04.23 |
[FireDAC] MySQL/mariaDB 서버 오류 메시지 한글 깨짐 (0) | 2021.04.16 |
[FireDAC] MySQL Commands out of sync; you can't run this command now (0) | 2021.04.02 |
댓글