네트워크

[네트워크 - 윤성우의 열혈 TCP/IP] 네트워크 프로그래밍과 소켓의 이해

우디혜 2020. 12. 27. 19:45

소켓 

네트워크 프로그래밍에서 소켓은 인터넷 혹은 네트워크로 연결된 두 개의 컴퓨터가 데이터를 송수신할 수 있도록 하는 역할을 담당한다. 소켓이라는 이름이 붙은 이유는 '연결'을 담당하기 때문이다.

 

소켓의 종류

소켓의 종류는 역할에 따라 두 가지로 나뉜다. 연결 요청을 기다리고 데이터를 전송하는 서버 소켓과 서버 소켓에게 연결을 요청하고 전송받은 데이터를 읽는 클라이언트 소켓이 있다.

 

소켓 생성 과정

서버 소켓 생성 과정은 아래와 같다.

   socket() - 서버 소켓 생성

   bind() - IP 주소 + PORT 정보 할당

   listen() - 클라이언트의 연결 요청을 대기 

   accept() - 클라이언트의 연결 요청 수락

 

클라이언트 소켓 생성 과정은 더 간단하다.

   socket() - 클라이언트 소켓 생성

   connect() - 서버로 연결 요청

 

소켓의 주소 할당

생성된 소켓을 구분해주기 위해서 소켓을 생성한 다음 bind()를 통해 IP와 포트번호로 이루어진 주소를 할당해주는 작업이 필요하다.

 

서버 소켓 - listen() accept()

서버 프로그램에서 소켓 생성 이후에 listen()와 accept()를 차례대로 호출한다. 먼저 서버 소켓에서는 listen()를 호출하여 클라이언트 소켓으로부터 연결 요청을 받을 때까지 기다리는데, 연결 요청을 받기 전까지는 계속 block 상태를 유지한다(blocking function in C). 연결 요청을 받게되면 accept()를 통해 요청을 수락한다.

 

리눅스와 윈도우

고수준 파일 입출력(High-level File Access)은 ANSI 표준에서 정의하는 언어로 제공되기 때문에 어떤 OS에서나 사용이 가능하다. 예를 들어 ANSI C 언어로 작성된 I/O 프로그램은 어느 OS 위에서든 실행이 가능하다. 반면 저수준 파일 입출력 함수(Low-level File Access)는 표준이 아니기 때문에 같은 역할을 하는 함수일 지라도, OS에 따라 구현 상의 차이가 있다. 이러한 특성으로 인해 소켓 프로그래밍에서도 소켓 I/O를 위한 작업을 수행할 때 OS에 따라 약간의 차이가 발생한다.

 

I/O 차이

리눅스의 경우 소켓과 파일이 구분되지 않고 사용되기 때문에 파일 I/O 함수를 소켓의 I/O를 위해서 사용할 수 있다. 반면 윈도우는 소켓과 파일을 구분하고 있기 때문에 소켓 I/O를 위한 별도의 시스템 함수(send, recv 등)가 존재한다.

 

file descriptor 와 file handle

리눅스의 경우에는 소켓 생성 시 시스템 함수를 통해 file descriptor를 넘겨주지만, 윈도우에서는 file handle이라는 것을 반환해준다는 차이가 있다. 하지만 file descriptor와 file handle은 시스템으로부터 소켓에 부여된 정수라는 점에서는 동일하다고 할 수 있다.