본문 바로가기
Develop/Network

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

by Tarra 2023. 7. 1.

 

 

 

 

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

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

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

 

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

 

www.orentec.co.kr

에서 확인할 수 있습니다.

 

 


 

 

01. 다음 중, 데이터 전송옵션인 MSB_OOB에 대해서 잘못 설명한 것을 모두 고르면?

a. MSG_OOB는 Out-of-band 데이터의 전송을 의미한다. 그리고 이는 다른 경로를 통한 고속의 데이터 전송이라는 의미를 갖는다.

 

b. MSG_OOB는 다른 경로를 통한 고속의 데이터 전송이라는 의미를 갖기 때문에, TCP상에서도 이 옵션을 이용해서 전송된 데이터는 상대 호스트로 먼저 전송된다.

MSG_OOB는 Out-of-band 데이터 전송을 의미하지만, 이는 다른 경우를 통한 고속의 데이터 전송을 의미하지 않는다.

MSG_OOB는 TCP 소켓에서 특정 데이터를 우선적으로 전송하고 처리할 때 사용되는 옵션이지만, 다른 경로를 통해 고속으로 전송되는 것은 아니다.

 

c. MSG_OOB 옵션이 주어진 상태에서 상대 호스트로 데이터가 먼저 전송된 이후에는 일반 데이터와 동일한 형태와 순서로 읽혀진다. 즉, 전송이 빠를 뿐, 수신 측에서는 이를 인지하지 못한다.

MSG_OOB 옵션이 주어진 상태에서 전송된 데이터는 Out-of-band 데이터로 취급되며, 일반 데이터와는 구분된다.

따라서 수신 측에서는 MSG_OOB 옵션으로 전송된 데이터를 인지할 수 있다.

전송이 빠를 뿐만 아니라 Out-of-band 데이터로 처리되기 때문에 읽히는 순서도 우선적으로 처리할 수 있다.

 

d. MSG_OOB는 TCP의 기본 데이터 전송방식을 벗어나지 못한다. 즉, MSG_OOB 옵션이 지정되더라도 전송순서는 그대로 유지된다. 다만 이는 수신 측에 데이터 처리의 긴급을 요청하는 용도로 사용될 뿐이다.

 

정답 b, c

 

 

02. readv & writev 함수를 이용해서 데이터를 송수신 할 경우 어떠한 이점이 있는지 함수 호출의 횟수와 입출력 버퍼의 관점에서 각각 설명해보자.

readv와 writev 함수는 여러 개의 버퍼를 한 번에 송수신하는 기능을 제공한다.

이를 통해 다음과 같은 이점을 얻을 수 있다.

 

1. 함수 호출 횟수 감소

readv와 writev 함수를 사용하면 여러 개의 버퍼를 한번에 처리할 수 있으므로, 단일 함수 호출로 여러 개의 입출력 작업을 진행할 수 있다.

이는 시스템 호출에 따른 오버헤드를 줄여준다. 예를 들어, 10개의 작은 버퍼를 전송해야 할 때, readv/writev 함수를 사용하면 단일 호출로 모든 데이터를 처리할 수 있다. 이에 비해 read/write 함수를 사용하면 10번의 함수 호출이 필요하므로, 함수 호출 횟수가 크게 감소된다.

 

2. 입출력 버퍼 관리의 용이성

readv와 writev 함수를 사용하면 여러 개의 버퍼를 연속적으로 송수신할 수 있다.

이는 입출력 작업에 필요한 데이터를 여러 개의 버퍼에 나눠서 저장할 수 있는 유연성을 제공한다.

예를 들어, 파일을 읽어서 여러 개의 버퍼에 나눠서 저장하거나, 여러 개의 버퍼를 한 번에 네트워크로 전송할 수 있다.

이를 통해 입출력 버퍼의 구조를 잘 조직화하여 효율적인 데이터 전송을 할 수 있다.

 

더보기

모범 답안

readv & writev 함수는 둘 이상의 공간에 나뉘어서 저장되어 있는 데이터를 모아서 한번에 전송하거나 수신할 때 사용하는 함수이다. 이 둘을 이용하면 입출력 버퍼로의 데이터 송수신을 한번에 진행할 수 있기 때문에 보다 효율적인 데이터의 송수신이 가능하다.

그리고 입출력 함수의 호출횟수도 그만큼 줄기 때문에 그로 인한 이점도 더불어 생긴다.

 

 

03. recv 함수호출을 통해서 입력버퍼의 데이터 존재유무를 확인하고자 할 때(확인 후 바로 반환하고자 할 때), recv 함수의 마지막 전달인자인 데이터 전송의 옵션을 어떻게 구성해야 하는가? 그리고 각각의 옵션이 의미하는 바는 무엇인지도 설명해보자.

가장 일반적으로 사용되는 옵션은 'MSG_PEEK'이다.

이 옵션을 사용하면 입력 버퍼의 데이터를 확인할 수 있지만, 실제로 데이터를 읽어서 버퍼에서 제거하지는 않는다.

따라서 데이터를 확인한 후에도 여전이 다른 'recv' 호출에서 동일한 데이터를 읽을 수 있다.

 

다른 옵션으로는 'MSG_DONTWAIT'이 있다.

이 옵션을 사용하면 함수가 차단되지 않고 즉시 반환된다.

입력 버퍼에 데이터가 있는 경우 데이터를 읽고, 없는 경우에는 에러를 반환한다.

이를 통해 입출력 작업을 블로킹하지 않고 즉시 결과를 반환할 수 있다.

 

마지막으로, 'MSG_WAITALL' 옵션은 입력 버퍼에 충분한 데이터가 도착할 때까지 함수를 블로킹한다.

입력 버퍼에 데이터가 도착하지 않으면 함수는 계속 대기하며, 데이터가 도착하면 모든 데이터를 한번에 읽는다.

이 옵션은 정확한 데이터 양이 필요한 경우에 사용될 수 있다.

 

더보기

모범 답안

MSG_PEEK 옵션과 MSG_DONTWAIT 옵션을 조합해야 한다.

MSG_PEEK 옵션이 지정되면 입력 버퍼에 존재하는 데이터를 읽어 들이되, 읽어 들인 데이터를 입력버퍼에서 지우지 않으며,

MSG_DONTWAIT 옵션은 입력버퍼에 데이터가 존재하지 않아도 바로 반환하는 기능의 옵션이다.

 

 

04. 리눅스에서는 MSB_OOB 데이터의 수신을 이벤트 핸들러의 등록을 통해서 확인이 가능하다. 그렇다면 윈도우에서는 어떻게 MSG_OOB 데이터의 수신을 확인할 수 있는지, 그 방법을 설명해보자.

윈도우에서 MSG_OOB 데이터의 수신을 확인하기 위해서는 다음과 같은 절차를 따른다.

1. 소켓을 비동기 모드로 설정해야 한다. 이를 위해서 'WSAAsyncSelect' 함수를 사용하여 소켓에 대한 이벤트 핸들러를 등록해야 한다.

2. 'WSAAsyncSelect' 함수를 호출하여 이벤트 핸들러를 등록할 때, 관심 있는 이벤트로 'FD_OOB'를 지정한다. 이렇게 하면 MSG_OOB 데이터의 수신과 관련된 이벤트를 처리할 수 있게 된다.

3. 이벤트 핸들러 함수에서는 'WSAGETSLECTEVENT(lParam)' 함수를 사용하여 MSG_OOB 데이터 수신 이벤트를 확인한다. 이 함수는 이벤트 유형을 반환하므로 MSG_OOB 이벤트인지 확인할 수 있다.

4. MSG_OOB 데이터가 도착한 경우, 이벤트 핸들러 함수에서 해당 데이터를 수신하고 처리한다. 이를 위해서 'recv'함수를 사용하며, 마지막 전달인자로 MSG_OOB 옵션을 지정하여 OOB 데이터를 수신할 수 있다.

 

더보기

모범 답안

MSG_OOB 데이터의 수신은 select 함수의 입장에서 예외적인 데이터의 수신에 해당한다.

따라서, select 함수의 이러한 특성을 활용하면 윈도우 기반 예제에서도 Out-of-band 데이터의 수신을 확인할 수 있다.

 

 

 


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

https://cafe.naver.com/cstudyjava

 

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

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

cafe.naver.com