Today I Learned

TCP/IP 소켓 프로그래밍(1) 본문

TCP IP

TCP/IP 소켓 프로그래밍(1)

처니형 2022. 8. 4. 21:18

01. 네트워크 프로그래밍에서 소켓이 담당하는 역할은 무엇인가? 그리고 소켓이라는 이름이 붙은 이유는 어디에 있는가?

- 우선 오늘날 대한민국에 존재하는 대부분의 컴퓨터가 인터넷이라는 거대한 네트워크로 연결되어 있으니 물리적인 연결은 신경 쓸 필요가 없다. 때문에 물리적인 연결을 기반으로하는 소프트웨어적인 데이터의 송수신 방법만 고민하면 된다.

- 운영체제에서 '소켓(Socket)'이라는 것을 제공한다. 이는 물리적으로 연결된 네트워크상에서의 데이터 송수신에 사용할 수 있는 소프트웨어적인 장치를 의미한다.

- 우리는 전력망으로부터 전기를 공급받기 위해서 소켓을 꽂는다. 즉, 가전기기의 소켓은 전력망으로의 연결에 사용된다. 마찬가지로 멀리 떨어져있는 컴퓨터와 데이터를 송수신하려면 인터넷이라는 네트워크 망에 연결해야 한다. 그리고 프로그래밍에서의 '소켓'은 네트워크 망의 연결에 사용되는 도구이다.

02. 서버 프로그램에서는 소켓생성 이후에 listen 함수와 accept 함수를 차례대로 호출한다. 그렇다면 이들의 역할은 각각 무엇인지 비교해서 설명해보자.

listen

- 전화기의 케이블 연결에 비유되는 listen 함수

- 연결요청 가능상태로 변경

accept

- 수화기를 드는 것에 비유되는 accept 함수

- 연결요청에 대한 수락

- 연결요청이 없는 상태에서 이 함수가 호출되면, 연결요청이 있을 때까지 함수는 반환하지 않는다.

03. 리눅스의 경우 파일 입출력 함수를 소켓 기반의 데이터 입출력에 사용할 수 있다. 반면 윈도우에서는 이것이 불가능하다. 그렇다면 리눅스에서는 가능하고, 윈도우에서는 불가능한 이유가 무엇인가?

- 리눅스에서의 소켓조작은 파일조작과 동일하게 간주되기 때문에 리눅스는 소켓을 파일의 일종으로 구분한다.

따라서 파일 입출력 함수를 소켓 입출력에, 다시 말해 네트워크상에서의 데이터 송수신에 사용할 수 있다.

- 윈도우는 리눅스와 달리 파일과 소켓을 구분하기 때문에 파일 입출력 함수를 소켓 기반의 데이터 입출력에 사용할 수 없다.

- 윈도우는 리눅스와 달리 파일 핸들과 소켓 핸들을 구분하고 있다.

- 기본적으로 두 운영체제의 커널은 구조적으로 차이가 있고, 운영체제에 따른 코드의 구현 스타일도 각각 별도로 존재한다. 

- 윈도우는 파일 입출력 함수와 소켓 입출력 함수가 엄연히 구분된다.

04. 소켓을 생성한 다음에는 주소할당의 과정을 거친다. 그렇다면 주소할당이 필요한 이유는 무엇이며, 이를 목적으로 호출하는 함수는 또 무엇인가?

- socket을 전화기로 봤을 때, 전화기만 장만해 놓았다고 해서 끝난 것이 아니다. 전화기를 장만했으니, 전화번호를 부여 받아야 한다. 그래야 누군가 나에게 전화를 걸 수 있지 않겠는가? 소켓도 마찬가지이다. 전화기에 전화번호가 할당되는 것처럼, bind 함수를 이용해서 생성한 소켓에 IP와 포트번호라는, 소켓의 주소정보에 해당하는 것을 할당해야 한다.

#include <winsock2.h>

int bind(SOCKET s, const struct sockaddr *name, int namelen);
-> 성공 시 0, 실패 시 SOCKET_ERROR 반환

- 클라이언트 프로그램에서 소켓을 기반으로 연결요청을 할 때 호출하는 함수로써 connect() 함수가 존재한다.

※ listen 함수가 호출되어야 클라이언트는 연결요청을 위해서 connect 함수를 호출할 수 있다. listen 함수 이전에 connect 함수가 호출되면 오류가 발생한다.

#include <winsock2.h>

int connect(SOCKET s, const struct sockaddr *name, int namelen);
-> 성공 시 0, 실패 시 SOCKET_ERROR 반환

05. 리눅스의 파일 디스크립터와 윈도우의 핸들이 의미하는 바는 사실상 같다. 그렇다면 이들이 의미하는 바가 무엇인지 소켓을 대상으로 설명해보자.

- 파일 디스크립터란 시스템으로부터 할당 받은 파일 또는 소켓에 부여된 정수를 의미한다.

- 일반적으로 파일과 소켓은 생성의 과정을 거쳐야 파일 디스크립터가 할당된다.

- 파일 또는 소켓을 생성할 때마다, 운영체제는 해당 파일 또는 소켓에 부여된 숫자 하나를 건네 줄 것이다. 그것이 운영체제와 사용자가 편하게 대화하는 방법이 된다. 즉, 파일 디스크립터란 운영체제가 만든 파일 또는 소켓의 지칭을 편히 하기 위해 부여된 숫자에 지나지 않는다.

- '핸들'이라는 표현은 주로 윈도우에서 사용되고 '디스크립터'라는 표현은 리눅스 기반으로 설명할 때 사용된다.

06. 저 수준 파일 입출력 함수와 ANSI 표준에서 정의하는 파일 입출력 함수는 어떠한 차이가 있는가? 

- 여기서 말하는 저 수준이란 말은 "표준에 상관없이 운영체제가 독립적으로 제공하는~"의 의미로 사용된다. 즉, 리눅스에서 제공하는 함수라는 뜻이지, ANSI 표준에서 정의한 함수가 아니라는 뜻이다.

※ 별도의 생성과정을 거치지 않아도 프로그램이 실행되면 자동으로 할당되는 파일 디스크립터

파일 디스크립터 대상
0 표준입력: Standard Input
1 표준출력: Standard Output
2 표준에러: Standard Error

 

'TCP IP' 카테고리의 다른 글

TCP/IP 소켓 프로그래밍(5)  (0) 2022.08.18
TCP/IP 소켓 프로그래밍(4)  (0) 2022.08.16
TCP/IP 소켓 프로그래밍(3)  (0) 2022.08.09
TCP/IP 소켓 프로그래밍(2)  (0) 2022.08.05
Comments