01. 네트워크 프로그래밍에서 소켓이 담당하는 역할, 소켓이라는 이름이 붙은 이유
- 물리적으로 연결된 네트워크망에서 두 컴퓨터간 데이터 송수신을 담당하는 소프트웨어적 장치
- 소켓이라는 이름이 붙은 이유는, 네트워크망에 '연결'하는 역할을 맡기 떄문
02. 서버 프로그램에서 listen()과 accept() 함수의 역할
- listen() 을 통해 연결 요청을 받아들일 수 있는 상태가 되고
- accept() 를 통해 들어온 연결 요청을 수락해 데이터를 주고받는다.
03. 리눅스에서는 파일 입출력을 소켓 기반 데이터 입출력에서 활용 가능하지만 윈도우는 아닌 이유
- 리눅스에서는 파일과 소켓을 같은 파일 디스크립터로 관리하지만 윈도우에서는 소켓 핸들과 파일 핸들을 구분하기 떄문
04. 소켓 생성 이후 주소할당이 필요한 이유
- 네트워크 상에서 소켓을 구분하기 위한 역할을 하는 것이 주소이기 때문
05. 리눅스의 파일 디스크립터와 윈도우의 핸들이 의미하는 바를 소켓을 대상으로 설명
- 파일 디스크립터와 윈도우 핸들 모두, OS에서 소켓을 관리하기 위해 부여한 정수값이다.
06. 저수준 파일 입출력 함수와 ANSI 표준 파일 입출력 함수의 차이
- 저수준 파일 입출력 함수는 OS상에서 제공하는 파일 입출력 함수이다. 따라서 운영체제마다 다른 함수를 사용해야 한한다.
- ANSI 표준 입출력 함수는 C에서 제공하는 함수이기 떄문에 OS에 상관없이 사용할 수 있다.
07. 각각 저수준 파일 입출력 함수와 ANSI 표준 입출력 함수를 사용하여 복사 프로그램을 작성하라
int GetLen(const char* str)
{
int i = 0;
while (str[i] != '\0')
{
++i;
}
return i;
}
// 저수준 입출력
void CopyLow(const char* src, const char* dst)
{
int fd, fd2;
char buf[100];
fd = _open(src, O_RDONLY | O_TEXT);
fd2 = _open(dst, O_WRONLY | O_CREAT | O_TEXT, S_IWRITE);
if (fd == -1 || fd2 == -1)
{
printf("Invalid File");
exit(1);
}
int err = 0;
while (!_eof(fd))
{
err = _read(fd, buf, sizeof(buf));
if (err == -1)
{
printf("_read error");
exit(1);
}
int len = GetLen(buf);
_write(fd2, buf, len + 1);
}
_close(fd);
_close(fd2);
}
// ANSI 표준 입출력
void CopyANSI(const char* src, const char* dst)
{
FILE* rfp = nullptr;
FILE* wfp = nullptr;
fopen_s(&rfp, src, "r");
fopen_s(&wfp, dst, "w");
if (rfp == nullptr || wfp == nullptr)
{
printf("fopen err");
exit(1);
}
char ch;
while (!feof(rfp))
{
ch = fgetc(rfp);
fputc(ch, wfp);
}
fclose(rfp);
fclose(wfp);
return;
}