파일 디스크립터
•
파일 디스크립터란 시스템(운영체제)이 특정 파일에 할당해준 정수값을 의미한다. 이는 파일뿐만 아니라 소켓도 같은 자원을 가지고 있다.
•
자주 사용되는 표준 입력(0), 표준 출력(1), 표준 에러(2)에 대해서는 이미 값이 할당되어 있다. 이러한 이유로 새로 파일 디스크립터를 할당 받게되면 3번부터 시작하게 된다.
파일 디스크립터 할당
•
사용자가 원하는 파일을 읽거나 쓰는 경우에는 open() 함수를 이용하여 파일 디스크립터를 할당받을 수 있다. 읽기와 쓰기는 open() 함수의 파라미터에 플래그 형태로 전달하여 호출하면 고유한 파일 디스크립터 값을 반환해준다.
•
이처럼 파일 디스크립터를 할당 받으면 그를 이용해 파일에 접근할 수 있는데, 소켓에도 동일하게 적용할 수 있다. 소켓으로 프로세스 간 통신하는 경우에도 파일 디스크립터를 이용하는데, c언어에서 소켓을 생성하는 socket()함수과 새로운 소켓을 연결하는 accept() 모두 파일 디스크립터 값을 반환한다.
소켓
•
소켓이란 다른 네트워크나 다른 프로세스에 정보 전달을 목적으로 하는 통신 방법이다. 소켓을 생성하며 파일 디스크립터에 소켓 정보 구조체를 저장하고, 서버 및 클라이언트의 소켓 정보 구조체에서 IP 주소와 port 번호 등을 참조하여 네트워크 상에서 다른 프로세스를 찾아 데이터를 전달한다.
•
OSI 7계층 중 응용 계층에 속하는 모든 프로세스는 소켓을 거쳐 데이터 송수신한다. 즉, 소켓은 전송계층과 응용 프로그램 사이의 인터페이스 역할을 하며 떨어져 있는 두 호스트를 연결해준다.
일반적인 소켓의 흐름
•
서버
1.
소켓 생성
2.
바인딩(IP 주소, port 번호, 프로토콜 체계 설정)
3.
클라이언트 요청 대기(listen)
4.
클라이언트 연결(accept)
5.
데이터 송수신
6.
소켓 닫기(close)
•
클라이언트
1.
소켓 생성
2.
서버에 설정된 IP 주소, port 번호로 연결 시도
3.
서버에서 accept로 생성된 클라이언트 디스크립터 수신
4.
데이터 송수신
5.
소켓 닫기