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

-> 물리적으로 연결되어있는 네트워크 상에서 데이터 송수신에 사용할 수 있는 소프트웨어적인 장치역할을 하고, 멀리 떨어져있는 컴퓨터와 데이터를  송수신하려면 인터넷 망에 연결해야하는데 프로그래밍에서 소켓은  네트워크 망에 연결에 사용되는 도구로 사용되므로 '연결'이라는 의미가 담겨있어서 소켓이라는 표현을 사용한다. 

* 물리적 연결: 직접 연결과 인터넷(네트워크) 연결



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

-> listen함수 호출 시 클라이언트가 서버에 연결을 요청 할 수 있는 상태가 되고 이어서 accept함수 호출 시 서버가 클라이언트의 연결 요청을 받아들이며 서버와 클라이언트의 연결이 완료된다.

 

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

-> 리눅스는 파일과 소켓이 같다. 즉, 소켓도 파일로 간주하기 때문에 파일 입출력 함수를 소켓 기반의 데이터 입출력에 사용할 수 있다.

윈도우는 소켓과 파일이 구분되기 때문에 파일입출력과 소켓입출력이 구분된다.


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

-> IP주소와 포트넘버를 할당하는데, IP는 컴퓨터를 구분하는 목적으로 사용되고 포트넘버는 컴퓨터로 전송된 데이터를 소켓에 전달해주는데 사용된다.

즉 IP주소는 컴퓨터를 구분하고 포트넘버는 소켓을 구분하기 위해 사용되고 이 정보를 이용해 데이터를 주고 받기 때문에 생성한 소켓에  bind함수로 주소를 할당하는 과정을 거친다.


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

-> 리눅스의 파일 디스크립터와 윈도우의 핸들은 소켓을 구분하고 지정하는 목적으로 소켓에 부여된 정수값이다.


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

-> 저 수준 파일 입출력 함수는 운영체제 별로 정의하는 형태가 다르고, ANSI표준에서 정의하는 파일 입출력은 C언어 기반의 표준 라이브러리 함수이므로  모든 운영체제에서 사용가능하다.


07. 저수준 파일 입출력 함수와 ANSI표준 입출력함수를 기반으로 파일 복사 프로그램을 작성하시오.


-> 저수준 파일 입출력

2행은 open 함수를 위한 헤더, 3행은 read, write함수를 위한 헤더다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#define BUF_SIZE 100
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("open() error!!");
               return 0;
        }
        while ((read_cnt = read(file1, buf, BUF_SIZE)) != 0)
               write(file2, buf, read_cnt); 
        close(file1);
        close(file2);
        return 0;
}
 
cs


-> ANSI표준 파일 입출력
자주 쓰이는 형태이므로 익혀둘 필요가 있음
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
#include <stdio.h>
#define BUF_SIZE 100
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("fopen() error");
               return 0;
        }
        while (1)
        {
               read_cnt = fread((void*)buf, 1, BUF_SIZE, file1); /
               if (read_cnt < BUF_SIZE)  //읽어온 데이터는 버퍼 사이즈를 넘을 수 없음
               {
                       if (feof(file1) != 0//파일의 끝에 도달= 0이아닌 값
                       {
                              fwrite((void*)buf, 1, read_cnt, file2);
                              break;
                       }
                       else
                              puts("복사 오류");
                       break;
               }
        }
        fclose(file1);
        fclose(file2);
        return 0;
}
cs


'열혈 TCP IP 소켓 프로그래밍' 카테고리의 다른 글

Chapter04 내용 확인문제  (0) 2020.06.20
Chapter03 내용 확인 문제  (0) 2020.06.20
Chapter02 내용 확인문제  (0) 2020.06.19

+ Recent posts