2011. 8. 12. 06:54

01. 표준 입출력 함수를 사용했을 때 얻게 되는 장점 두 가지는 무엇인가? 그리고 그 두가지 장점을 얻게 되늰 이유는 또 무엇인가?

02. 표준 출력함수를 이용해서 데이터를 전송하는 경우에는 다음과 같이 생각하는 것은 옳지 않다.
"fputs 함수호출을 통해서 데이터를 전송하면, 함수가 호출되자 마자 데이터의 전송이 시작될 거야."
그렇다면 위와 같은 생각이 옳지 않은 이유는 무엇이고, 위와 같이 생각하기 위해서는 추가로 어떠한 과정이 필요한지 설명해 보자.
Posted by Triany
2011. 8. 12. 05:22

01. TTL이 의미하는 바는 무엇인가? 그리고 TTL의 값이 크게 설정되는 것과 작게 설정 되는 것에 따른 차이와 문제점을 라우팅의 관점에서 설명해보자.
 - 작게 설정 : 보내야 하는 위치까지 데이터가 갈 수 없음
 - 크게 설정 : 돌아다니는 패킷이 너무 많다.
  ...(내생각;;()



02. 멀티캐스트와 브로드캐스트의 공통점은 무엇이고 또 차이점은 무엇인가? 데이터의 송수신 관점에서 설명해 보자.
공통점 : 한 번에 여러 호스트에 데이터를 전송
차이점 : 전송이 이루어 지는 범위
   - 멀티캐스트 : 서로 다른 네트워크 상에 연결되어있는 호스트라 할 지라도 멀티캐스트그룹에 가입되어 있으면 데이터 수신 가능
   - 브로드 캐스트 : 동일한 네트웨크로 연결되어 있는 호스트로 데이터의 연결 대상 제한

03. 다음중 ....

04. 멀티캐스트는 트래픽 측면에서도 긍정적이다!! 그렇다면 어떠한 이유로, 어떻게 긍정적인지 TCP의 데이터 송수신 방식과 비교해서 설명해 보자.
  -1000개의 호스트에게 파일을 전송하기 위해 딱 한번만 멀티캐스트 방식으로 파일을 전송해도 가능하다. 호스트에서 하나의 패킷만 보내도, 라우터 측에서 1000개의 호스트에게 파일을 복사해서 전송.


05. 멀티캐스트 방식의 데이터 송수신을 위해서 MBone 이라는 가상의 네트워크가 구성되어 있어야 한다. 즉, MBone은 멀티캐스트를 위한 네트워크이다. 그런데 이러한 MBone을 가리켜 가상 네트워크라 한다. 그렇다면 여기서 말하는 가상네트워크가 무엇을 뜻하는지 설명해보자.
 - 가상네트워크 : 인터넷 상에서 별도의 프로토콜을 기반으로 동작하는 소프트웨어적인 개념의 네트워크.
                         멀티캐스트에 필요한 네트워크 구조를 인터넷 망을 바탕으로 소프트웨어적으로 구현해 놓은 가상의 네트워크
Posted by Triany
2011. 8. 10. 12:11

리눅스 프로그래밍(TCP/IP 소켓 프로그래밍)을 하는 도중에, 빈번한 세그먼테이션 오류로 고생하던중..ㅠㅠ
원인을 찾았다...

원인은 대부분.;; 나의 오타..;;
음... 그러니까 - visual스튜디오에서는, c프로그래밍중 대부분의 오류를 잡아주지만...
gcc 상에서는.. 그냥 컴파일 - > 실행 ..ㅠㅠ 환경이기 때문에,(컴파일에서 오류를 못잡아주고.. 실행시.. dump dump..)
오타가 나는 경우.. 알아채기가 힘들다...ㅠㅠ

음... 이번 경우에서는
긴 프로그래밍에서

printf("Result : %s \n", sum);  .... 이것 때문..;;
printf("Result: %d\n", sum); .. 이렇게 했어야 하는데.....


많은 지식인 님들의 조언에 의하면,
* 세그먼 테이션 오류는
  - 포인터를 잘 못 사용할 시 발생
  - 포인터, 또는 배열의 메모리를 잘 못 사용할 경우
  ( 포인터로 지정해 놓고, 초기화도, 메모리 할당도 안해준 경우)
등등의 경우로 볼 수 있었다. - -
물론,
리눅스가 아닌 솔라리스 서버를 사용할 경우에,, 함수가 호환이 안되서(???) 메모리 덤프가 일어나는 경우도 있었음 -


여하튼.. 중요한건... 오타의 최소화!
Posted by Triany
2011. 8. 6. 14:07
02. readv& writev 함수를 이용해서 데이터를 송수신 할 경우 어떠한 이점이 있는지 함수 호출의 횟수와 입출력 버퍼의 관점에서 각각 설명해 보자.
   - 데이터 송수신의 효율성을 향상
   - writev 함수를 사용하면 여러 버퍼에 나뉘어 저장되어 있는 데이터를 한 번에 전송할 수 있고,
   - 또 readv 함수를 사용하면 데이터를 여러 버퍼에 나눠서 수실할 수 있다.


03. recv 함수호출을 통해서 입력 버퍼의 데이터 존재 유무를 확인하고자 할 때(확인 후 바로 반환하고자 할 때) recv함수의 마지막 전달인자인 데이터 전송의 옵션을 어떻게 구성해야 하는가? 그리고 각각의 옵션이 의미하는 바는 무엇인지도 설명해 보자.
while(1)
{
    str_len=recv(recv_sock, buf, sizeof(buf)-1, MSG_PEEK|MSG_DOWNWAIT);
    if ( str_len > 0 )
       break;
}


04. 리눅스에서는 MSB_OOB 데이터......
Posted by Triany
2011. 8. 6. 13:38

01. 멀티플렉싱 기술에 대한 일반적인 의미를 말하고, IO멀티플렉싱 한다는 것이 무엇을 의미하는지 설명해 보자.
*멀티 플렉싱
  - 하나의 통신 채널을 통해서 둘 이상의 데이터 시그널을 전송하는데 사용되는 기술.
  - 물리적 장치의 효율성을 높이기 위해서 최소한의 물리적인 요소만을 사용해서 최대한의 데이터를 전달하기 위해 사용되는 기술.
  =>


02. 멀티 프로세스 기반의 동시 접속 서버의 단점은 무엇이며, 이를 멀티 플렉싱 서버에서 어떻게 보완하는지 설명해 보자.
client의 수만큼 child 프로세스를 생성
=> 멀티 플렉싱 기술을 적용하면, 프로세스의 수가 줄어든다. 즉, 접속해 있는 클라이언트의 수에 상관없이 서비스를 제공하는 프로세스의 수는 딱 하나..


03. 멀... (생략)

04. select 함수의 관찰대상에 서버 소켓(리스닝 소켓)도 포함시켜야 한다. 그렇다면 어떠한 부류에 포함을 시켜야 하며, 그 부류에 포함시키는 이유도 설명해 보자.
- 연결요청이 있었다는 뜻...


05. select 함수의 호출에 사용되는 자료형 fd_set 의 정의형태는 윈도우와 리눅스에서 차이를 보인다. 그렇다면 어떻게 차이가 나는지 설명하고, 차이가 날 수 밖에 없는 이유에 대해서도 설명해 보자.
Posted by Triany
2011. 7. 30. 11:15
01. 프로세스에 대한 설명_ (OX 문제, 책에_)

02. fork 함수...... (OX문제, 책에_)

03. 자식 프로세스가 생성되면 부모 프로세스의 모든 것을 복사하는데, 이때 복사의 대상으로 소켓의 파일 디스크립터도 포함이 된다. 그러다면 복사한 파일 디스크립터의 정수 값은 원본 파일 디스크립터의 정수 값과 동일한지 확인하기 위한 프로그램을 작성해 보자.

04. 프로세스가 좀비가 되는 경우에 대해서 설명하고, 이를 막기 위해서 어떠한 방법을 취해야 하는지 설명해 보자.
* 자식프로세스가 종료되는 상황
  - 인자를 전달하면서 exit를 호출하는 경우
  - main 함수에서 return 문을 실행하면서 값을 반환하는 경우
* 좀비가 되는 경우 : 자식프로세스의, exit 함수로 전달되는 인자값과 main함수의 return 문에 의해 반환되는 값 모두 운영체제로 전달된다. 그리고 운영체제는 이 값이 자식 프로세스를 생성한 프로세스에게 전달될 때까지 자식프로세스를 소멸시키지 않는데, 바로 이 상황에 놓여있는 프로세스를 가리켜 "좀비 프로세스"라 한다.

아래의 함수를 사용하여, 자식프로세스의 종료됨을 알린다.(자식 프로세스의 전달 값을 요청)
방법 1 : wait 함수 사용    (블로킹 될 수 있음)
방법 2 : waitpid 함수 사용(블로킹 되지 않음)



05. SIGINT에 대한 핸들러를 등록하지 않은 상태에서 Ctrl+C키가 입력되면, 운영체제가 지정해 놓은 디폴트 이벤트 핸들러에 의해서 프로그램이 종료되어 버린다. 그러나 Ctrl+C키에 대한 핸들러를 직접 등록하면 프로그램은 종료되지 않고 프로그래머가 지정한 이벤트 핸들러가 대신 호출된다. 그렇다면 일반적인 프로그램에서 다음과 같이 동작하도록 이벤트 핸들러 등록을 위한 코드를 구성해 보자.
"Ctrl+C키가 눌리면, 정말로 프로그램을 종료할 것인지 묻고, 이에
 대한 대답으로 'Y'가 입력되면 프로그램을 종료한다."

그리고 간단히 문자열은 1초당 한번 정도 반복 출력하는 프로그램을 작성해서 위의 이벤트 핸들러 등록 코드를 적용시켜보자.
Posted by Triany
2011. 7. 29. 15:37



01. Time-wait 상태에 대해 설명(OX문제_ 책에)



02. 옵션 TCP_NODELAY는 Nagle 알고리즘과 간련이 있다. 이 옵션을 이용해서 Nagle 알고리즘을 해제할 수도 있는데, 그렇다면 어떠한 경우에 한해서 Nagle알고리즘의 해제를 고민해 볼 수 있겠는가? 이를 송수신하는 데이터의 특성과 관련해서 설명해 보자.

Nagle알고리즘을 중단해야 하는 경우
"Nagle 알고리즘의 적용여부에 따른 트래픽의 차이가 크지 않으면서도 Nagle 알고리즘을 적용하는 것보다 데이터의 전송이 빠른경우"_대용량 파일 데이터의 전송의 경우로, 파일데이터를 출력버퍼로 밀어 넣는 작업시간이 얼마 걸리지 않기에 Nagle알고리즘을 적용하지 않아도 출력버퍼를 거의 꽉 채운 상태에서 패킷을 전송하게 되는데, 이 경우 패킷의 수가 크게 증가하지도 않을 뿐더러, ACK를 기다리지 않고 연속해서 데이터를 전송하니 전송속도가 놀랍게 향상된다.
Posted by Triany
2011. 7. 29. 14:58
도메인 이름을 이용해서 IP 주소 얻어오기
다음 함수를 이용하면 문자열 형태의 도메인 이름으로부터 IP주소정보를 얻어올 수 있다.

#include <netdb.h>

struct hostent * gethostbyname(const char * hostname);
    =>성공시 hostent 구조체 변수의 주소 값, 실패 시 NULL 포인터 반환

struct hostent //hostent구조체
{
      char * h_name;         // official name
      char ** h_aliases;     // alias list
      int h_addrtype;          // host address type
      int h_length;              // address length
      char ** h_addr_list;    // address list
h_name
이 멤버에는 '공식 도메인 이름(Official domain name)'이 저장된다.
h_aliases
하나의 IP에 둘 이상의 도메인 이름을 지정하는 것이 가능하기 때문에, 공식 도메인 이외에 해당 메인 페이지를 접속할 수 있는 다른 도메인 이름의 지정이 가능.(h_aliases를 통해 얻을 수있음)
h_addrtype
gethostbyname은 IPv4뿐만 아니라 IPv6도 지원. 때문에 h_addr_list로 반환된 IP주소체계에 대한 정보를 이 멤버를 통해 반환
(IPv4경우 AF_INET반환)
h_length
함수 호출의 결과로 반환된 IP주소의 크기.(IPv4경우 4바이트)
h_addr_list
이 멤버를 통해서 도메인 이름에 대한 IP주소가 정수의 형태로 반환
(참로 : 접속자수가 많은 서버는 하나의 도메인 이름에 대응하는 IP를 여러개 둬서, 둘 이상의 서버로 분산시킬 수 있는데, 이러한 경우에도 이 멤버를 통해서 모든 IP의 주소를 얻어올 수 있다.)



예제소스_ gethostbyname.c




예제결과_gethostbyname www.google.com






IP주소를 이용해서 도메인 정보 가져오기
 #include <netdb.h>

struct hostent * gethostbyaddr(const char * addr, socklen_t len, int family);
     => 성공시 hostent 구조체 변수의 주소값, 실패시 NULL포인터 반환
인자설명
addr : IP주소를 지니는 in_addr 구조체 변수의 포인터 전달, IPv4이외의 다양한 정보를 전달받을 수 있도록 일반화하기 위해서 매개변수 char형 포인터로 선언
len : 첫 번째 인자로 전달된 주소정보의 길이, IPv4의 경우 4, IPv6의 경우 16전달.
family : 주소체계 정보 전달. IPv4의 경우 AF_INET, IPv6의 경우 AF_INET6전달
ex) host = gethostbyaddr((char*)&addr.sin_addr, 4, AF_INET);

예제: gethostbyaddr.c




출처 : 열혈강의tcp/ip 소켓 프로그래밍_윤성우

Posted by Triany
2011. 7. 29. 14:44

01. DNS(Domain Name System)에 대한 설명

??????DNS서버는 사실상 라우터를 의미한다? 라우터가 도메인 이름정보를 참조하여 데이터의 진로를 결정하기 때문???
-->진위여부 찾기
???? DNS 서버는 운영체제에 따라서 구분이 된다. 즉 윈도우용 DNS서버와 리눅스용 DNS서버는 구분이 된다?????


02. 생략

03. 웹 브라우저의 주소 창에
www.orentec.co.kr을 입력해서 메인 페이지가 보이기까지의 과정을 정리해 보자. 단 웹 브라우저가 접속한 디폴트 DNS서버에는 www.orentec.co.kr에 대한 IP주소가 등록되어 있지 않다고 가정하자.

가상의 주소(www.orentec.co.kr  도메인 주소)를 실제주소(IP)주소로 변환하기 위한 변환을 담당하는 부분이 바로 DNS서버이다. 웹 브라우저가 접속한 디폴트 DNS서버에 해당 도메인(
www.orentec.co.kr)의 IP주소를 갖고 있지 않는다면, 상위 계층의 DNS서버에 물어봐 알려준다. 이런식으로 계속 올라가다 보면 최상위 DNS서버인 root DNS서버에까지 질의가 전달되는데, Roor DNS서버는 해당 질문을 누구에게 재 전달해야 하는지 알고 있다. 이 결과는 진행된 반대 방향으로 전달되어  질의를 시작한 호스트에게 IP 주소인 211.239.163.22가 전달된다.
DNS는 계층적으로 관리되는 일종의 분산 데이터베이스 시스템이다.

Posted by Triany
2011. 7. 29. 12:25

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.