Skip to content

Latest commit

 

History

History
87 lines (72 loc) · 5.15 KB

File metadata and controls

87 lines (72 loc) · 5.15 KB

소켓 프로그래밍 및 파일 제어 (0518)

TCP (Transmission Control Protocol)

  • 연결 지향형 프로토콜로 데이터의 신뢰성 있는 전송을 보장.

파일 디스크립터 (File Descriptor)

  • 운영체제(커널)가 생성한 파일 또는 소켓을 식별하기 위해 할당하는 정수 값.
  • 저수준 파일 입출력 함수(read, write 등)는 입출력 대상을 지정하기 위해 파일 디스크립터를 인자로 요구함.

파일 오픈 플래그 및 제어

  • O_RDONLY: 읽기 전용 모드로 파일 오픈.
  • O_WRONLY: 쓰기 전용 모드로 파일 오픈.
  • O_RDWR: 읽기 및 쓰기 겸용 모드로 파일 오픈.
  • O_CREAT: 대상 파일이 존재하지 않을 경우 파일 생성 수행.
  • O_TRUNC: 기존 파일이 존재할 경우 파일 내용을 완전히 제거하고 초기화.
  • O_APPEND: 기존 파일 내용을 보존하며 데이터 끝에 추가 기록(Append) 수행.
  • O_EXCL: O_CREAT와 함께 사용하며, 파일이 이미 존재할 경우 오픈 실패 반환.
  • 파일 제어 작업 완료 후에는 반드시 close 함수를 호출하여 할당된 자원을 해제해야 함.

파일 접근 권한

  • 파일 제어 시 해당 프로세스에 적절한 접근 권한이 부여되어 있어야 함 (예: 읽기 권한이 누락된 경우 read 수행 불가).

표준 입출력 vs 저수준 입출력

  • fopen 등 표준 라이브러리 함수는 내부적으로 버퍼를 사용하여 입출력을 최적화함.
  • open 등 저수준 함수는 별도의 사용자 영역 버퍼 없이 System Call을 직접 호출하여 동작함.
  • 커널 영역의 디바이스 드라이버 개발 시에는 표준 라이브러리 사용이 제한되므로, 반드시 저수준 System Call 인터페이스를 구축해야 함.

프로토콜 체계 (Protocol Family)

  • PF_INET: IPv4 인터넷 프로토콜 체계를 의미함.

소켓 타입 (Socket Type) 및 상세 특징

  • SOCK_STREAM (연결 지향형 - TCP): 전송 중 데이터 유실이 없으며, 순차적 전송 및 1대1 연결 구조를 보장함.
  • SOCK_DGRAM (비연결 지향형 - UDP): 빠른 전송을 지향하며, 순서 상관없이 전송되나 데이터 손실 우려가 있음.

서버 소켓 생성 및 통신 절차

  1. 소켓 생성: socket(domain, type, protocol)
    • domain: 프로토콜 체계 (예: PF_INET).
    • type: 전송 방식 (예: SOCK_STREAM, SOCK_DGRAM).
    • protocol: 특정 프로토콜 지정 (보통 0).
  2. 주소 할당: bind(sockfd, addr, addrlen)
    • sockfd: 소켓 파일 디스크립터.
    • addr: IP 주소와 포트 번호를 담은 구조체 포인터.
    • addrlen: 주소 구조체의 크기.
  3. 연결 대기: listen(sockfd, backlog)
    • sockfd: 서버 소켓 파일 디스크립터.
    • backlog: 연결 요청 대기 큐(Wait Queue)의 크기.
  4. 연결 수락: accept(sockfd, addr, addrlen)
    • sockfd: 서버 소켓 파일 디스크립터.
    • addr: 연결된 클라이언트의 주소 정보를 저장할 포인터.
    • addrlen: 주소 정보의 크기를 담은 변수 포인터.

서버측 기본 흐름 (C)

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: 서버 주소 구조체의 크기.

클라이언트측 기본 흐름 (C)

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 시 에러가 발생할 수 있음.

Makefile 빌드 시스템 기초

  • 패턴 규칙 (%.o: %.c): 모든 .c 파일을 동일한 이름의 .o 파일로 컴파일하는 범용 템플릿.
  • 자동 변수 (Automatic Variables):
    • $@: 현재 규칙의 타겟(Target) 파일명.
    • $<: 현재 규칙의 첫 번째 종속 항목(Prerequisite) 파일명.

[새로운내용]