2010-12-08 7 views
0

학교에서 C 언어로 FTP 프로그램을 작성하는 작업이 있습니다 (Linux의 경우). 나는 모든 기본적인 기능을 (ls, cd) 시간이 없어 작동하지만 파일 전송 부분에 문제가있다. 나는이 같은 소켓을 통해 파일을 전송하는 sendfile을 사용 나는 클라이언트 측에서이 파일을 수신하는 방법을 알아 내기 위해C 소켓으로 파일 보내기

int fd = open(temp, O_RDONLY); 
int rc = sendfile (client_fd, fd, &offset, statbuf.st_size); 

수없는 것. 나는 디버깅을 위해 다음과 같이 그것을 시도 :

while((i = read(sock, message, MSG_LEN - 1)) > 0) { 

    message[i] = '\0'; 
    printf("%s", message); 
} 

이 텍스트 파일을 인쇄에 좋은 일을하지만, 내가 바이너리 파일을 보내려고하는 경우, 예를 들어, 그냥 바이너리 파일과 중단의 시작 부분을 출력 read() 부분 (서버에서 오는 것이 없기 때문에)이라고 생각합니다.

의견을 보내 주셔서 감사합니다.

shutdown(client_fd, SHUT_WR); 

(shutdown() 대신 close()의 사용, 그래서 : 수신기에 도달 한 파일의 끝을 알 수 있도록

+0

아마도 소켓 디스크립터가 입력이고 출력용으로 파일이 열려있는 상태에서 sendfile을 다시 시도해보십시오. –

+2

BTW/이진 파일에는 printf와 같은 C 스타일 함수가 ASCIIZ NUL 터미네이터뿐만 아니라 화면 지우기, 커서 이동 등의 ASCII 제어 코드에 해당하는 다른 값과 마찬가지로 실수로 0 바이트를 포함 할 수 있습니다. 파일을 인쇄해야합니다 16 진수로 바이트 단위로 내용을 읽거나 사람이 읽을 수 있고 터미널과 호환되도록 다른 방법으로 사용하십시오. –

+0

fwrite (message, 1, i, stdout)를 사용하고 프로그램의 출력을 셸의 파일로 리디렉션하십시오. –

답변

2

당신은 파일을 전송 한 후 종료로 소켓의 작성 측이 필요 상대방이 전체 파일을 성공적으로 받았는지 여부를 알 수 있습니다).

그러면 읽는 쪽에서 파일 끝 (read()이 0)이 표시됩니다.이 시점에서 소켓의 끝은 close()입니다. 그러면 서버는 파일 끝을 볼 것이고 소켓도 닫을 수 있습니다 (성공적인 전송 기록).

+0

그게 정확히 도움이되지 않았다, 그것은 내가 처음 게시물에 설명 된 것처럼 파일을 전송하지만 지금은 'get'후에 다른 명령을 주려고하면 'broken pipe'오류가 발생합니다. – ehehhh

+0

나는 recv()를 사용하는 것이 좋습니다. 여러분은 read() 또는 recv()를 제안 해 주시겠습니까? – ehehhh

+0

답변 해 주셔서 감사 드리며 다른 사람들에게 제안 해 주셔서 감사합니다. 문제는 파일을 보내기 전에 프로그램을 fork()하려고했는데, 제대로하지 않았기 때문에 모든 것을 엉망으로 만든 것입니다. 이제 작동합니다. – ehehhh