1.네트워크 프로그래밍에서 소켓이 담당하는 역할은 무엇인가? 그리고 소켓이라는 이름이 붙인 이유는 어디에 있는가?
>소켓은 물리적으로 연결되어있는 호스트간 데이터 송수신에 필요한 프로토콜로부터 프로그래머를 자유롭게 하는 데이터 송수신의 매개체이다. 소켓은 인터넷이라는 거대한 네트워크 망으로의 연결 도구로 사용되기 때문에 소켓이라는 이름이 붙게 된 것이다.
2. 서버 프로그램에서는 소켓생성 이후에 listen 함수와 accept 함수를 차례대로 호출한다. 그렇다면 이들의 역할은 각각 무엇인지 비교해서 설명해보자
>listen 함수가 호출되면 소켓은 연결요청이 가능하게 된 상태이다. 그러나 실제 연결이 완료되려면 accept 함수가 호출되어야한다.
3.리눅스의 경우 파일 입출력 함수를 소켓 기반의 데이터 입출력에 사용할 수 있다. 반면 윈도우에서는 이것이 불가능하다. 그렇다면 리눅스에서는 가능하고, 윈도우에서는 불가능한 이유가 무엇인가?
>리눅스는 소켓도 파일로 간주한다. 즉, 이 둘을 구분 짓지 않기 때문에 파일 입출력 함수를 소켓 입출력에도 사용할 수 있다. 하지만 윈도우는 리눅스와 달리 파일과 소켓을 구분 짓기 때문에 파일 입출력 함수와 소켓 입출력 함수가 구분되어 있다.
4.소켓을 생성한 다음에는 주소할당의 과정을 거친다. 그렇다면 주소할당이 필요한 이유는 무엇이며, 이를 목적으로 호출하는 함수는 또 무엇인가?
>인터넷상에서 소켓을 구분하기 위해서는 주소정보가 필요하다. 따라서 bind 함수를 이용하여 주소할당의 과정을 거친다.
5.리눅스의 파일 디스크립터와 윈도우의 핸들이 의미하는 바는 사실상 같다. 그렇다면 이들이 의미하는 바가 무엇인지 소켓을 대상으로 설명해보자
>리눅스의 파일 디스크립터는 파일을 구분하고 지칭할 목적으로 파일에 부여된 정수 값이다. 리눅스의 파일 디스크립터와 윈도우의 핸들은 소켓을 구분하고 지정하는 목적으로 소켓에 부여된 정수 값이다.
6.저 수준 파일 입출력 함수와 ANSI 표준에서 정의하는 파일 입출력 함수는 어떠한 차이가 있는가?
>ANSI 표준에서 정의한 입출력 함수는 운영체제에 상관없이 C의 표준으로 제공되는 함수이다. 즉, 모든 운영체제에서 사용 가능하다. 반면, 저수준 파일 입출력 함수는 운영체제가 제공하는 입출력 함수이다. 따라서 운영체제 별로 정의하고 있는, 형태가 다른 입출력 함수이다.
7.본문에서 보인 예제 low_open.c와 low_read.c를 참조하여 파일 복사 프로그램을 작성하되, 저 수준 파일 입출력 함수를 기반으로, 그리고 ANSI 표준 입출력함수를 기반으로 각각 한번씩 작성해보자.
저 수준 파일 입출력 함수 기반
#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 -1;
}
while ((read_cnt = read(file1, buf, BUF_SIZE)) != 0)
write(file2, buf, read_cnt); //file1에서 읽어들여 file2에 복사
close(file1);
close(file2);
return 0;
}
ANSI 표준 입출력 함수 기반
#include <stdio.h>
#define BUF_SIZE 80
int main(void)
{
char buf[BUF_SIZE];
int read_cnt;
FILE *file1 = fopen("C:\\file1.txt", "rb"); //읽기전용
FILE *file2 = fopen("C:\\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;
}
[참조] 윤성우 저 TCP/IP 소켓 프로그래밍
'C > TCPIP 소켓 프로그래밍(윤성우 저)' 카테고리의 다른 글
TCP/IP 소켓 프로그래밍 4장 내용 확인문제 (0) | 2017.05.22 |
---|---|
TCP/IP 소켓 프로그래밍 3장 내용 확인문제 (0) | 2017.05.18 |
TCP/IP 소켓 프로그래밍 2장 내용 확인문제 (0) | 2017.05.16 |
리눅스 기반 서버, 클라이언트 예제 (5) | 2017.05.13 |
윈도우 기반 서버, 클라이언트 예제 (18) | 2017.05.13 |