본문 바로가기
열심히 살기/Network

소켓 프로그래밍 - 파일 디스크립터

by yeni03o_o 2020. 12. 12.

파일 디스크립터

- 시스템으로부터 할당받은 파일 또는 소켓에 부여된 정수

- 저수준 파일 입출력 함수(open, close)에게 소켓의 파일 디스크립터 인자를 전달하면, 소켓을 대상으로 입출력 진행

파일 디스크립터 대상
0 표준입력: Standard Input
1 표준출력: Standard Output
2 표준에러: Standard Error

 

 

파일입출력 함수

* 파일 열기: open()

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

// 성공 시 파일 디스크립터, 실패 시 -1 반환
int open(const char *path, int flag);
// *path: 파일의 이름 및 경로정보
// flag: 파일의 오픈모드
오픈모드(flag 값) 의미
O_CREAT 필요하면 파일 생성
O_TRUNC 기존 데이터 전부 삭제
O_APPEND 기존 데이터 보존 + 뒤에 이어서 저장
O_RDONLY 파일 오픈(읽기 전용)
O_WRONLY 파일 오픈(쓰기 전용)
O_RDWR 파일 오픈(읽기 + 쓰기)

 

* 파일 닫기: close()

#include <unistd.h>

// 성공 시 0, 실패 시 -1 반환
int close(int fd);

 

* 파일에 데이터 쓰기: write()

#include <unistd.h>

// 성공 시 전달한 바이트 수, 실패 시 -1 반환
ssize_t write(int fd, const void *buf, size_t nbytes);
// fd: 데이터 전송대상을 나타내는 파일 디스크립터
// buf: 전송할 데이터가 저장된 버퍼의 주소 값
// nbytes: 전송할 데이터의 바이트 수

 

* 파일에 저장된 데이터 읽기: read()

 

#include <unistd.h>

// 성공 시 수신한 바이트 수(파일의 끝을 만나면 0), 실패 시 -1 반환
ssize_t read(int fd, void *buf, size_t nbytes);
// id: 데이터 수신대상을 나타내는 파일 디스크립터
// buf: 수신한 데이터를 저장할 버퍼의 주소 값
// nbytes: 수신할 최대 바이트 수

 

 

파일 디스크립터와 소켓

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/socket.h>

void error_handling(char* message);

int main(void)
{
    int fd1, fd2, fd3;
    char buf[]="Yeni\n";
    
    //하나의 파일과 두 소켓 생성
    fd1=socket(PF_INET, SOCK_STREAM, 0);
    fd2=open("test.txt", O_CREAT|O_WRONLY|O_TRUNC);		//파일 오픈모드: O_CREAT, O_WRONLY, O_TRUNC
    								//새로운 파일이 생성되어 쓰기만 가능
                                				//test.txt 파일이 이미 존재한다면 파일의 모든 데이터는 지워짐
    if(fd2==-1)
    	error_handling("open() error!");
        printf("file descriptor: %d \n", fd2);
    
    if(write(fd2, buf, sizeof(buf))==-1)			// buf에 저장된 데이터를 fd2 파일 디스크립터에 전송
    	error_handling("write() error!");
        
    fd3=socket(PF_INET, SOCK_DGRAM, 0);				//비연결 지향형 소켓 → 한번에 전송되는 데이터 크기 제한
    								//			데이터 손실 및 에러 발생 가능
    
    //앞서 생성한 파일 디스크립터 정수 값 출력
    printf("file descriptor 1: %d\n", fd1);
    printf("file descriptor 2: %d\n", fd2);
    printf("file descriptor 3: %d\n", fd3);
    
    close(fd1);
    close(fd2);
    close(fd3);
    return 0;
}

void error_handling(char* message)
{
    fputs(message, stderr);
    fputc('\n', stderr);
    exit(1);
}

 

 

코드 실행 결과

 - 표준입출력에 0, 1, 2가 이미 할당됐으므로 디스크립터는 생성된 순서에 따라 3, 4, 5로 할당됨

하나의 파일과 두 소켓의 파일 디스크립터 정수 값 출력

 

공부하면서 학습 목적으로 작성한 포스팅이므로 내용이 완전하지 않습니다ㅠ 
계속해서 학습 후 지식이 좀 더 쌓이면 수시로 수정해나갈 예정입니다! 
틀린 내용은 둥글게 댓글 달아주시면 빠른 확인 후 수정하겠습니다. :)


코드 출처

윤성우 저 '윤성우의 열혈 TCP/IP 소켓 프로그래밍'

 

참고

* valueelectronic.tistory.com/212

* mang-geun.tistory.com/entry/012-%EB%A6%AC%EB%88%85%EC%8A%A4-%EA%B8%B0%EB%B0%98-%ED%8C%8C%EC%9D%BC-%EC%A1%B0%EC%9E%91%ED%95%98%EA%B8%B0

 

댓글