(C/C++/Windows) WinInet FTP 다운로드 질문입니다.

WinInet FTP를 이용해서 프로그램 업데이트 런처를 만들고 있습니다.

서버: 윈도우 서버2012 / 파일질라 0.9.60
클라이언트 프로그램: x86 / MFC

우선 파일비교/다운로드까지 기본적인 예제들을 참고하면서 구현완료되었습니다.

다만 다운로드할 파일 목록을 vector 컨테이너에 넣어놓고 파일 다운로드를 반복하는 과정 도중, FtpOpenFile() 함수로 파일 핸들을 얻어오는 과정에서 파일 4~5개마다 약 4초 이상정도 딜레이가 걸립니다.
특히 자잘한 파일들 받아오는 과정에서 이런 현상이 일어납니다.

// 파일 비교/다운로드 스레드
bool trd() {
// ... 스레드 시작, 리스트 작성
// 목록의 파일 다운로드 루프
	for (size_t i = 0; i < vecUpdateFileList.size(); i++) {
		if (pushCancel == true) {	succeess = false;		break;	} // 취소버튼 중지
		...
		if (DownloadFile(vecUpdateFileList[i].name + 2, NULL) == false) { // 다운로드 함수 호출
			succeess = false;
			errorNumber = i;
			break;
		}
		...
	}
	...
	return true;
}

// 파일 다운로드 함수
bool DownloadFile(char* _fname, char* _secondftppath) {

	//...

	char msgBuf[512];
	DWORD timeCheck = GetTickCount();
	// 원격 파일에 접근
	HINTERNET hRemoteFile = FtpOpenFile(hFTPSession, _fname, GENERIC_READ, FTP_TRANSFER_TYPE_BINARY, NULL); // 여기서 지연시간이 걸림.
	DWORD delayed = GetTickCount() - timeCheck;
	sprintf_s(msgBuf, "TIME: %d\n", delayed);
	OutputDebugString(msgBuf);

	// ...
	// 원격 파일 읽어서 디스크에 쓰기, 파일 날짜 수정
	// ...
}
// ... 종료 프로세스

// 디버깅 출력.
TIME: 0
TIME: 0
TIME: 0
TIME: 0
TIME: 15
TIME: 4516
접근 시간 오래걸림 - /file6.dat
200 Type set to I
227 Entering Passive Mode (0,0,0,0,24,55)
213 7148
150 Opening data channel for file download from server of “/file6.dat”
TIME: 0
TIME: 16
TIME: 0
TIME: 4515
접근 시간 오래걸림 - file10.dat
200 Type set to I
227 Entering Passive Mode (0,0,0,0,24,48)
213 7159
150 Opening data channel for file download from server of “file10.dat”

// 마지막 파일 파일질라 로그
(011018)2021-05-31 오후 15:12:52 - updateaccount (0.0.0.0)> TYPE I
(011018)2021-05-31 오후 15:12:52 - updateaccount (0.0.0.0)> 200 Type set to I
(011018)2021-05-31 오후 15:12:52 - updateaccount (0.0.0.0)> PASV
(011018)2021-05-31 오후 15:12:52 - updateaccount (0.0.0.0)> 227 Entering Passive Mode (0,0,0,0,24,48)
(011018)2021-05-31 오후 15:12:52 - updateaccount (0.0.0.0)> SIZE file10.dat
(011018)2021-05-31 오후 15:12:52 - updateaccount (0.0.0.0)> 213 7159
(011018)2021-05-31 오후 15:12:52 - updateaccount (0.0.0.0)> RETR file10.dat
(011018)2021-05-31 오후 15:12:52 - updateaccount (0.0.0.0)> 150 Opening data channel for file download from server of “/file10.dat”
(011018)2021-05-31 오후 15:12:52 - updateaccount (0.0.0.0)> 226 Successfully transferred “/file10.dat”
(011018)2021-05-31 오후 15:12:52 - updateaccount (0.0.0.0)> disconnected.

파일질라 클라이언트의 다운로드 로그와 비교했을때에는
서버로 전송되는 TYPE I와 SIZE 커맨드가 빠지고 MLSD를 사용하는 것 같았습니다.

이 지연시간을 없애려면 WinInet쪽에서 간단히 해결할 방법은 없는지 궁금합니다.

일단 시도해본 방법은 원래 CFtpConnection 클래스를 사용하고있어 혹시나 하고 패킹 안된 함수를 그냥 사용하도록 변경해봤지만 역시나였고, InternetSetOption() 함수를 사용해서 timeout 설정으로 timeout시키고 재시도 하는 방향으로 작성해보았으나 4초아래로는 내려가질 않았습니다.

아니면 Command를 수동으로 입력해서 스트림을 받아와야 할까요?
그것도 아니면 FTP를 버리고 다른 솔루션을 찾아보는게 좋을까요?

==== 수정

앗… 아아… 커맨드로 시도했는데 커맨드에서도 지연이 발생합니다…
일단은 업데이트 파일이라는게 한번에 열개정도밖에 안올라가니 못쓸물건은 아니라서 그냥 쓰다가
그냥 다른분들이 오픈소스로 FTP 구현해둔거 참조해서 다운로드부분만 구현하던지,
아니면 HTTP나 WebDav쪽으로 갈아탈지 고민좀 해봐야겠습니다.

물론 고민만 하다가 한 세달쯤 지나서 다 잊어먹고있다가 다시 꺼내볼듯하네요.

고인물 한 명 더 들어왔네요… 환영합니다

안입니다 안입니다… 그럴리가업읍니다…

1 Like

업데이트 서버면 그냥 HTTP 하면 안되나요?