2013-04-09 2 views
0

FTP 서버를 코딩해야하며 데이터 전송 방법에 문제가 있습니다.소켓을 통해 바이너리 데이터를 송수신하는 방법은 무엇입니까?

나는 그것을 테스트하기 위해 ftp 명령을 사용하고 있으며 현재 작업 디렉토리에있는 파일/디렉토리 목록을 보내는 LIST을 작업 중입니다.

WARNING! 5 bare linefeeds received in ASCII mode 
File may not have transferred correctly. 

은 내가 FTP 이진 데이터를 기대하고있다 생각하지만 난 '돈, 그 경고를 제거 할 것입니다 : 모든 벌금 인쇄 다음과 같은 경고가 ftp를 제외하고 (FTP 아니라 파일의 목록을 인쇄) 작동 t 소켓을 통해 그런 식으로 데이터를 전송하는 방법을 알고, 나는 현재 ls 결과를 전송하는 가장 기본적인 방법을하고 있어요 :

FTP 프로토콜은 LIST 명령 즉, netascii를 그것의 결과를 보내도록 지정합니다
dup2(dst_channel, 1); 
execlp("ls", "ls", "-l", NULL); 
+0

FTP는 줄 바꿈이 CR-LF가 될 것으로 예상하지만 LF 만 보내는 것입니다. – Barmar

+0

명령 'ls'의 결과를 읽고 CR-LF로 모든 LF를 바꿀 필요없이 변경할 수 있습니까? –

답변

1

줄 바꿈은 r입니다. CRLF로 표명 됨. 그러나 표준 Linux 프로그램은 개행을위한 LF 만 출력합니다.

출력이 파이프에 연결된 상태에서 ls 명령을 실행해야합니다. 서버가 파이프에서 읽고 \n 문자를`\ r \ n '으로 바꾼 다음이를 소켓에 씁니다.

클라이언트가 바이너리 모드를 요청할 때를 제외하고는 실제 파일을 전송할 때 비슷한 작업을 수행해야합니다.

+0

고마워요, 그게별로 실용적이지는 않지만 제가 할 것입니다 ... –

+2

대안은 FTP가 기대하는 형식으로 출력하는 자신의'ls' 코드를 구현하는 것입니다. RFC 3659에'MLSD' 명령을 구현하려면이 작업을해야합니다. – Barmar

관련 문제