본문 바로가기
Develop/Network

[윤성우의 열혈 TCP/IP 소켓 프로그래밍] Chapter01 - 내용 확인 문제 풀이

by Tarra 2023. 6. 27.

 

 

 

 

 [윤성우의 열혈 TCP / IP 소켓 프로그래밍] 책을 기반으로 개인적으로  문제 풀이 및 개념을 정리한 내용입니다.

모든 소스 코드와 강의, 확인 문제의 정확한 답안은 (23년 7월 1일부터 전면 무료화 예정)

http://www.orentec.co.kr/

 

====== 오렌지 미디어 ======

 

www.orentec.co.kr

에서 확인할 수 있습니다.

 

 


 

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

 

소켓(socket)이란 운영체제에서 제공하는 송수신 방법으로 데이터 송수신의 원리를 이론적으로 잘 몰라도, 소켓이라는 것을 이용해서 데이터를 주고 받을 수 있도록 하는 소프트웨어적인 장치를 의미한다.

 

해당 이름이 붙은 이유는 연결이라는 의미가 담겨 있기 때문에 "소켓(socket)" 이라는 표현을 사용한다.

 

더보기

모범 답안

소켓은 물리적으로 연결되어 있는 호스트간 데이터 송수신에 필요한 프로토콜로부터 프로그래머를 자유롭게 하는

데이터 송수신의 매개체이다.

 

결국 소켓은 인터넷이라는 거대한 네트워크 망으로의 연결 도구로 사용되기 때문에 소켓이라는 이름이 붙게 된 것으로

정리할 수 있다.

 

 

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

 

소켓을 생성한 이후에 응답을 해주는 소켓을 listen 함수를 통해서 응답할 수 있는 상태로 만들고, 이후에 accept 함수를 통해서

요청해오는 클라이언트와 연결해주는 과정을 거치게 된다.

 

정리하면,

listen 함수 : 서버 소켓을 클라이언트에 응답할 수 있는 상태로 만드는 것.

accept 함수 : 클라이언트의 연결 요청에 응답하여 연결되는 것.

 

더보기

모범 답안

listen 함수가 호출되면 소켓은 연결 요청이 가능한 상태가 된다.

그러나 실제 연결이 완료되려면 accept 함수가 호출되어야 한다.

 

 

03. 리눅스의 경우 파일 입출력 함수를 소켓 기반의 데이터 입출력에 사용할 수 있다. 반면 윈도우에서는 이것이 불가능하다.

그렇다면 리눅스에서는 가능하고, 윈도우에서는 불가능한 이유가 무엇인가?

 

리눅스의 경우에는 소켓 자체를 파일로 간주하기 때문에, 파일 입출력 함수를 소켓 기반의 데이터 입출력에 사용할 수 있다.

하지만 윈도우의 경우에는 파일과 소켓을 따로 구분하고 있기 때문에 불가능하다.

 

더보기

모범 답안

리눅스는 소켓도 파일로 간주한다. 즉, 이 둘을 구분 짓지 않는 형태로 설계가 되어 있다.

따라서 파일 입출력 함수를 소켓 입출력에 사용할 수 있다. 하지만 윈도우는 리눅스와 달리 소켓과 파일을 동일하게 간주하지 않는다.

때문에 파일 입출력 함수와 소켓 입출력 함수가 구분되어 있다.

 

 

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

 

인터넷상에는 무수히 많은 소켓들이 존재할 것이다. 우리는 그 중 특정한 소켓과 연결을 해야하는데 주소가 없다면 소켓을 찾을 수 없을 것이다. 따라서 특정한 소켓과 연결하기 위해 주소할당의 과정을 거치며 

이를 위해서 호출하는 함수는 bind() 함수를 통해 특정 소켓에 주소를 할당하게 된다.

 

더보기

모범 답안

인터넷상에서 소켓을 구분하기 위해서는 주소 정보가 필요하다. 따라서 bind 함수 호출을 통해서 주소 할당의 과정을 거치는 것이다.

 

 

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

 

소켓은 운영체제에서 데이터 송수신을 원활하게 하기 위한 소프트웨어적인 장치이다.

해당 장치를 원활히 이용하기 위해서는 이 소켓을 다루기 위한 식별자가 필요한데, 이를 리눅스에서는 "파일 디스크립터"

윈도우에서는 "핸들" 이라고 명칭한다.

 

더보기

모범 답안

리눅스의 파일 디스크립터는 파일을 구분하고 지칭할 목적으로 파일에 부여된 정수 값이다. 이렇듯 리눅스의 파일 디스크립터와

윈도우의 핸들은 소켓을 구분하고 지칭하는 목적으로 소켓에 부여된 정수 값이다.

 

 

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

 

가장 큰 차이는 이식성에 있다고 할 수 있다.

ANSI 표준 파일 입출력 함수는 플랫폼 (Linux, Windows)에 종속되지 않고 사용할 수 있지만, 

저 수준 파일 입출력 함수의 경우는 운영체제마다 인터페이스와 동작 방식이 다를 수 있어 이식성이 떨어질 수 있다.

 

더보기

모범 답안

ANSI 표준에서 정의한 입출력 함수는 운영체제에 상관없이 C의 표준으로 제공되는 함수들이다.

따라서 언제는 호출이 가능하다. 반면 저 수준 파일 입출력 함수는 운영체제가 제공하는 입출력 함수이다.

따라서 운영체제 별로 정의하고 있는 형태가 다른 입출력 함수이다.

 

 

07. 본문에서 보인 예제 low_open.c와 low_read.c를 참조하여 파일 복사 프로그램을 작성하되, 저 수준 파일 입출력 함수를 기반으로, 그리고 ANSI 표준 입출력 함수를 기반으로 각각 한번씩 작성해보자. 그리고 복사 프로그램의 사용방법은 여러분이 임의로 결정하기 바란다.

 

(생략)

 

 

 


출처 : [윤성우의 열혈 TCP / IP 소켓 프로그래밍] / 윤성우 저 / 오렌지 미디어

https://cafe.naver.com/cstudyjava

 

윤성우의 프로그래밍 스터디그룹 [C/... : 네이버 카페

윤성우의 스터디 공간입니다. C와 JAVA를 공부하시는 분들은 모두 들어오세요. ^^

cafe.naver.com