게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
리눅스 TCP에서 클라이언트 -> 서버 파일 전송 질문입니다.
게시물ID : programmer_6789짧은주소 복사하기
작성자 : semitan
추천 : 0
조회수 : 9080회
댓글수 : 3개
등록시간 : 2014/11/27 19:18:30
옵션
  • 베스트금지
  • 본인삭제금지
혼자서 끙끙 알면서 했는데 이유를 모르겠습니다.

TCP로 클라이언트가 100MB 이상 되는 파일을 서버로 전송하는 프로그램입니다.
클라이언트 - (파일) -> 서버

처음에는 표준 입출력 함수(파일포인터, fread, fwrite) 부분만 썼는데 file의 일부분만 전송되고 <20MB ~ 60MB사이로 파일 실행마다 달라짐>

그다음에는 system call을 이용해서 write, read를 썼는데 server쪽에서 파일을 읽지 못했습니다.

이번 수업에 PPT 내용을 보니 표준 입출력 함수를 통해 데이터 전송을 하기 위해서는
파일 디스크립터를 파일 포인터로 만들어야 된다고 해서 
수업 중 배운 fdopen을 이용했는데  server쪽에서 file을 읽지 못합니다.

어떠한 점이 잘못됬는지 알려주시면 감사하겠습니다.
main 함수에는 TCP 연결 부분만 있고
전송부분은 함수로 따로 만들었습니다.

아래는 code입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//server.c 의 파일 송신 부분
void trans_file (int sd) //sd는 client socket
{
        char buffer[BUFSIZE]; //BUFSIZE는 1024로 define 되어 있음
        int fd; //파일 디스크립터
        FILE *writefp; //파일 포인터 (파일 디스크립터를 가리키는 포인터)
        FILE *readfp; //파일 포인터 (소켓을 가리키는 포인터)
        
        fd = open("test2.mp4", O_WRONLY|O_CREAT|O_TRUNC); //파일 오픈
 
        writefp = fdopen(fd, "w");  //파일 포인터와 파일 디스크립터 연결
        readfp = fdopen(sd, "r");  //파일 포인터와 소켓 연결
        int i = 0;
        while (1)
        {
                i++;
                printf("%d \n", i); //송신 되는지 확인
                fgets(buffer,BUFSIZE,readfp);  //소켓을 통해 전송된 내용을 buffer에 저장
                if (strstr (buffer, "end") == 0)  //송신이 끝나면 client가 end 전송
                {
                        printf("Transfer completion\n");
                        break;
                }
                fputs(buffer,writefp); //buffer에 저장된 내용을 test2.mp4로 저장
        }
 
        fclose (writefp);
        fclose (readfp);
        return;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//client.c 파일의 파일 전송 부분
void trans_file(int sd)//sd는 소켓
{
        int fd; //파일 디스크립터
        FILE *readfp; //파일 포인터 (test.mp4를 읽음)
        FILE *writefp; //파일 포인터 (server로 전송)
        fd = open("test.mp4", O_RDONLY); //파일 오픈
        if (fd == -1) // 에러 처리
        {
                printf("file open error \n");
                exit(1);
        }
        char buffer[BUFSIZE]; //BUFSIZE는 1024로 define
 
        readfp = fdopen(fd, "r");  //파일 포인터와 파일 디스크립터 연결
        writefp = fdopen(sd, "w"); //파일 포인터와 소켓 연결
 
        int i = 0; //전송 되나 확인
        while(!feof(readfp))
        {
                i ++;
                printf("%d\n", i);
                fgets(buffer,BUFSIZE,readfp); //test.mp4 파일을 BUFSIZE만큼 읽음
                fputs(buffer,writefp); //buffer 내용을 소켓에 전송
                fflush(writefp);
        }
 
        fputs ("end", writefp); //파일 전송이 끝나면 end를 보내 server.c의 반복문 종료
 
        return;
}

client측 실행 화면
1.png

server측 실행 화면
2.png

ls -l 명령어 실행 시
3.png




전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호