- 연결 지향형 프로토콜로 데이터의 신뢰성 있는 전송을 보장.
- 운영체제(커널)가 생성한 파일 또는 소켓을 식별하기 위해 할당하는 정수 값.
- 저수준 파일 입출력 함수(
read,write등)는 입출력 대상을 지정하기 위해파일 디스크립터를 인자로 요구함.
O_RDONLY: 읽기 전용 모드로 파일 오픈.O_WRONLY: 쓰기 전용 모드로 파일 오픈.O_RDWR: 읽기 및 쓰기 겸용 모드로 파일 오픈.O_CREAT: 대상 파일이 존재하지 않을 경우 파일 생성 수행.O_TRUNC: 기존 파일이 존재할 경우 파일 내용을 완전히 제거하고 초기화.O_APPEND: 기존 파일 내용을 보존하며 데이터 끝에 추가 기록(Append) 수행.O_EXCL:O_CREAT와 함께 사용하며, 파일이 이미 존재할 경우 오픈 실패 반환.- 파일 제어 작업 완료 후에는 반드시
close함수를 호출하여 할당된 자원을 해제해야 함.
- 파일 제어 시 해당 프로세스에 적절한 접근 권한이 부여되어 있어야 함 (예: 읽기 권한이 누락된 경우
read수행 불가).
fopen등 표준 라이브러리 함수는 내부적으로 버퍼를 사용하여 입출력을 최적화함.open등 저수준 함수는 별도의 사용자 영역 버퍼 없이System Call을 직접 호출하여 동작함.- 커널 영역의 디바이스 드라이버 개발 시에는 표준 라이브러리 사용이 제한되므로, 반드시 저수준
System Call인터페이스를 구축해야 함.
PF_INET: IPv4 인터넷 프로토콜 체계를 의미함.
SOCK_STREAM(연결 지향형 - TCP): 전송 중 데이터 유실이 없으며, 순차적 전송 및 1대1 연결 구조를 보장함.SOCK_DGRAM(비연결 지향형 - UDP): 빠른 전송을 지향하며, 순서 상관없이 전송되나 데이터 손실 우려가 있음.
- 소켓 생성:
socket(domain, type, protocol)domain: 프로토콜 체계 (예:PF_INET).type: 전송 방식 (예:SOCK_STREAM,SOCK_DGRAM).protocol: 특정 프로토콜 지정 (보통0).
- 주소 할당:
bind(sockfd, addr, addrlen)sockfd: 소켓 파일 디스크립터.addr: IP 주소와 포트 번호를 담은 구조체 포인터.addrlen: 주소 구조체의 크기.
- 연결 대기:
listen(sockfd, backlog)sockfd: 서버 소켓 파일 디스크립터.backlog: 연결 요청 대기 큐(Wait Queue)의 크기.
- 연결 수락:
accept(sockfd, addr, addrlen)sockfd: 서버 소켓 파일 디스크립터.addr: 연결된 클라이언트의 주소 정보를 저장할 포인터.addrlen: 주소 정보의 크기를 담은 변수 포인터.
int serv_sock = socket(PF_INET, SOCK_STREAM, 0); // 1. 소켓 생성
bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)); // 2. 주소 할당
listen(serv_sock, 5); // 3. 연결 대기 큐 설정
int clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size); // 4. 연결 수락- 연결 요청:
connect(sockfd, serv_addr, addrlen)sockfd: 클라이언트 소켓 파일 디스크립터.serv_addr: 대상 서버의 주소 정보를 담은 구조체 포인터.addrlen: 서버 주소 구조체의 크기.
int sock = socket(PF_INET, SOCK_STREAM, 0); // 1. 소켓 생성
connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)); // 2. 연결 요청- Null 문자(
\0) 삽입:read호출 후 수신 길이(str_len) 위치에\0를 삽입하여 문자열 오염 방지. - 종료 감지 (EOF):
read함수의 반환값이0인 경우, 클라이언트가close를 호출하여 연결을 정상 종료했음을 의미함. - 자원 해제: 연결 종료 감지 시 서버에서도 반드시
close(clnt_sock)를 호출하여 파일 디스크립터를 반납해야 함.
- 최대 연결 수: 특정 함수 인자가 아닌 시스템의 파일 디스크립터(
ulimit -n) 및 커널 제한에 의해 결정됨. - 서버 종료 및 포트 재사용: 서버가 클라이언트보다 먼저 종료될 경우, 해당 포트가
TIME_WAIT상태로 유지되어 즉시bind시 에러가 발생할 수 있음.
- 패턴 규칙 (
%.o: %.c): 모든.c파일을 동일한 이름의.o파일로 컴파일하는 범용 템플릿. - 자동 변수 (Automatic Variables):
$@: 현재 규칙의 타겟(Target) 파일명.$<: 현재 규칙의 첫 번째 종속 항목(Prerequisite) 파일명.
[새로운내용]