2009-12-14 3 views
4

.NET Framework 1.0이 시작되면 .NET에서 사용할 수있는 FTP 클라이언트 구현이 없으므로 System.Net.Socket을 사용하여 자체 구현을 작성했습니다. 최근에 나는 그것을 약간 변경해야했고, 디버깅하는 동안 연결을 닫을 때 IIS 5.1 FTP 서버에서 출력을 깨고 (WinXP SP 2) 테스트했습니다.IIS 5.1 FTP 서버에서 예기치 않은 바이트 시퀀스가 ​​반환되었습니다.

통신은 다음과 같이 진행한다 :

Send: QUIT<CRLF> 
Receive: 221<CRLF><NUL>?<ETX><NUL> 
(socket closed) 

ftp 명령 채널 처리기 라인 지향 터미네이터로 CRLF를 사용하고, 제 1 CRLF 후 4 바이트를 수신하면,이 타임 아웃의 원인 제 CRLF 기다린다 오류. 전체 시퀀스는 단일 소켓 읽기 작업에서 반환되며 소켓에서 반환 된 바이트 수가 올바른지 확인했습니다.

이 바이트 시퀀스는이 서버와 일관성이 있으며, 이것이 예상되는지/방지 할 수 있는지, 아니면 "MS FTP 서버 단점"목록에 "빠른 수정"을 추가해야하는지 궁금합니다.

+2

IIRC FTP 사이트의 설정에서 QUIT 메시지를 변경할 수 있습니다.이 메타베이스 속성에 잘못된 데이터가 포함되어있을 수 있습니다. – Lucero

+0

종료 메시지를 변경해 보았는데 예상대로 221 메시지가 나타납니다. "221 goodbye ? q " – EventHorizon

+0

FTP 서버 연결이 자연스럽게 떨어지면 시간 초과가 발생합니다. btw : 포트 21로 telnet으로 이것을 재현 할 수 있지만, 그것은 당신 것 (xp sp3)과 다른 쓰레기 값입니다. 좋은 버그. –

답변

1

이상하지는 않지만 FTP 서버가 올바른 응답을 반환하고 예상치 못한 결과가 나오는 것처럼 보입니다. 클래스를 디자인하고 있다면,보고되지 않은 텍스트 버퍼를 유지해야합니다 (한 줄의 전체 줄을 읽지 않을 경우를 대비해 이미 읽었을 수도 있음). 줄을 반환 할 함수가 호출되면 텍스트를 제거하고 CRLF 앞에 물건을 반환하고 다음 함수를 위해 나머지는 그대로 두십시오. 반환 할 전체 행이 없을 때만 기다려야합니다.

위의 상황을 해결해야합니다. 함수는 호출자가 성공적으로 해석 할 수있는 "221"을 반환 할만큼 충분하며 호출자는 더 기다리지 않아 최종 대기를 방지합니다.

다음과 같이 또는 추가로 : 함수가 소켓의 종료를 감지 할 수있는 경우 (응답을 보낸 후 게시물이 원격 사이트에서 오는 것처럼 보이기 때문에)이 경우 대기도 막을 수 있습니다 .

+0

필자는이를 철저히 테스트하지는 않았지만 회신에 회선 대시가 포함되어 있지 않으므로 남은 바이트는 무시해도 안전합니다. 당신의 솔루션도 잘 작동하지만 여분의 비트를 보관할 필요는 없습니다. – EventHorizon