리셋 되지 말자

[윤성우의 열혈 tcp/ip 소켓 프로그래밍] 내용 확인문제 본문

socket

[윤성우의 열혈 tcp/ip 소켓 프로그래밍] 내용 확인문제

kyeongjun-dev 2020. 4. 6. 16:59

Ch1

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

  • 소켓은 물리적으로 연결된 네트워크상에서의 데이터 송수신에 사용할 수 있는 소프트웨어적인 장치이다.
  • 가전기기의 소켓은 전력망으로의 연결에 사용된다. 마찬가지로 멀리 떨어져있는 컴퓨터와 데이터를 송수신하려면 인터넷이라는 네트워크 망에 연결해야 한다.
  • '소켓'은 네트워크 망의 연결에사용되는 도구이다. 이렇듯 연결이라는 의미가 담겨있어서 '소켓'이라는 표현을 사용한다.

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

-listen 함수 : 소켓을 연결 가능한 상태로 만든다.
-accpetn 함수 : 데이터의 송수신을 위해 연결요청을 해오면, accept함수호출을 통해 그 요청을 수락한다.

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

-리눅스에서는 소켓을 파일의 일종으로 구분한다. 따라서 파일 입출력 함수를 소켓 입출력에, 다시 말해서 네트워크상에서의 데이터 송수신에 사용할 수 있다. 반면 윈도우는 리눅스와 달리 파일과 소켓을 구분하고 있다. 때문에 별도의 데이터 송수신 함수를 참조해야한다.

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

-소켓에 IP주소와 포트번호를 할당하기 위해서 bind함수를 호출하여 사용한다.(소켓에 주소정보를 할당한다.)

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

-소켓을 구분하기 위한 번호를 부여하는 것이다.

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

-저 수준 파일 입출력 함수는 해당 운영체제 에서만 동작하는 함수이고, ANSI 표준에서 정의하는 파일 입출력 함수는 운영체제에 상관없이 동작하는 함수이다.
-저 수준 파일 입출력 함수는 운영체제마다 형태가 다르다.
-ANSI 표준에서 정의하는 파일 입출력 함수는 C의 표준이다.

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

file1.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#define BUF_SIZE 80
 
int main(int argc, int argv[]){
        int file1, file2;
        char buf[BUF_SIZE];
        int read_cnt;
 
        file1 = open("file1.txt", O_RDONLY); //읽기 전용
        file2 = open("file2.txt", O_CREAT | O_WRONLY | O_TRUNC); //파일 생성, 쓰기전용, 내용이 있다면 내용 다 지우기
 
        if (file1 == -1 || file2 == -1){
               puts("file open error");
               return 0;
        }
 
        while ((read_cnt = read(file1, buf, BUF_SIZE)) != 0)
               write(file2, buf, read_cnt); //file1에서 읽어들여 file2에 복사
 
        close(file1);
        close(file2);
 
        return 0;
}
cs

file2.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h>
#define BUF_SIZE 80
 
int main(void){
        char buf[BUF_SIZE];
        int read_cnt;
 
        FILE *file1 = fopen("file1.txt""rb"); //읽기전용
        FILE *file2 = fopen("file2.txt""wb"); //쓰기전용
 
        if (file1 == NULL || file2 == NULL){
               puts("file open error");
               return -1;
        }
 
        while (1){
               read_cnt = fread((void*)buf, 1, BUF_SIZE, file1); //읽어오고
               if (read_cnt < BUF_SIZE){
                       if (feof(file1) != 0){
                              fwrite((void*)buf, 1, read_cnt, file2);
                              break;
                        }
                        else
                              puts("copy error");
                       break;
 
               }
        }
        fclose(file1);
        fclose(file2);
 
        return 0;
 
}
cs
Comments