파일 디스크립터
- 시스템으로부터 할당받은 파일 또는 소켓에 부여된 정수
- 저수준 파일 입출력 함수(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
'열심히 살기 > Network' 카테고리의 다른 글
소켓 프로그래밍 - TCP 기반(서버, 클라이언트) (6) | 2020.12.12 |
---|---|
소켓 프로그래밍 - 바이트 순서(호스트, 네트워크) (0) | 2020.12.12 |
소켓 프로그래밍 - 연결지향형 소켓(TCP 소켓) (0) | 2020.12.12 |
소켓 프로그래밍 - 코드실행(서버, 클라이언트) (0) | 2020.12.11 |
소켓 프로그래밍(Socket Programming) (0) | 2020.12.11 |
댓글