Thursday, January 27, 2011

chapter 8 (도메인 이름과 인터넷 주소)

-Domain Name System-
IP주소와 도메인 이름 간의 변환하는 시스템을 DNS(Domain Name System) 이라고 한다

도메인 이름이란?
DNS 서버
도메인 이름은 가상 주소. 때문에 도메인으로 특정 서버에 접속 하려면 실제 주소인 IP주소로 변환 해야 한다. 이러한 변환을 담당하는 것이 DNS 서버. 보통 컴퓨터 마다 DNS 서버를 지정한다. 그런데 디폴트 DNS 서버가 모든 도메인의 IP를 알고 있지는 않다. 만약 내 컴퓨터가 정한 DNS 서버가 도메인의 IP를 모른다면 그 DNS 서버는 자기보다 상위의 DNS 서버에게 물어보고 결국 최상위 DNS 서버까지 가서 최상위 DNS 서버는 그 정보가 있는 DNS 서버까지 질문을 돌리고 다시 거꾸로 IP정보가 돌아온다.


-IP주소와 도메인 이름 사이의 변환-


프로그램상에서 도메인 이름을 쓸 필요가 있는가?
도메인 이름은 한번 등록하면 계속 쓰는 한편 IP 주소는 자주 변하니까

도메인 이름을 이용해서 IP주소 얻어오기
struct hostent * gethostbyname(const char * hostname); 란 함수를 사용하면 문자열 형태의 도메인 이름으로 IP주소를 얻을수 있다. 성공시 hostent 구조체 변수의 주소값이 실패시 NULL 포인트 반환. 이 구조체는 책 참조


IP주소를 이용해서 도메인 정보 얻어오기
반대로 IP주소에서 도메인 정보를 얻어 올때 쓰는 함수는 struct hostent * gethostbyaddr(const char * addr, socklen_t len, int family); 로 addr에는 in_addr 구조체 변수(IPv4 일때. 만약 다른 주소체계면 거기에 맞는 구조체 사용), len은 addr 인자의 길이, family는 주소체계(IPv4 경우 AF_INET 전달). 성공시 hostent 구조체 변수의 주소값 전달, 실패시 null 반환

chapter 7 (소켓의 우아한 연결종료)

-TCP 기반의 Half-close-
TCP에서 연결과정에서는 큰변수가 생기지 않지만 종료과정은 그렇지 않다. 따라서 종료과정은 명확해야 한다,

일방적인 연결종료의 문제점
close함수는 완전 종료를 의미. 이는 데이터의 전송뿐 아니라 수신하는 것 조차 불가능하게 한다.
half-close 란 데이터의 송수신에 사용되는 스트림의 일부만 종료하는 것으로 전송은 가능하지만 수신을 불가능 하거나 반대로 전송은 불가능 하지만 수신은 가능한 종료를 의미 한다.

소켓과 스트림 
두 호스트가 소켓을 통해 연결된 상태를 '스트림이 형성된 상태'라고 한다. 좀더 자세하게 이야기 하자면 두 호스트는 두개의 스트림에 의해 연결된 상태이다.  호스트 A에서의 출력스트림은 호스트 B의 입력 스트림과 연결되고 A의 입력스트림은 B의 출력 스트림과 연결된 상태이다.
close 함수를 쓰면 이 두 스트림이 다 끊기는 경우고 half-close는 하나만 끊는거다.

우아한 종료를 위한 shutdown 함수
half-close를 위해 shutdown 함수를 사용한다. int shutdown(int sock, int howto); 의 형태로 성공시 0 실패시 -1 반환. 두번째 인자의 종류로는 SHUT_RD, SHUT_WR, SHUT_RDWR. RD는 입력스트림 종료(데이터 수신 불가능), WR는 출력 스트림 종료(데이터 송신 불가능), RDWR는 둘다 종료.

Half-close가 필요한 이유
서버가 클라이언트로 데이터를 전송하고 전송이 다 마치면 클라이언트라 서버로 메시지를 하나 던지는 상황을 생각해보면, 데이터 전송이 다 끝났다는 표시는 서버가 클라이언트로 EOF를 전송하는 것인데 close를 써서 EOF를 던지게 되면 마지막에 클라이언트로 부터의 메시지를 수신할 수 없게 된다. 그렇기에 출력 스트림만 종료하는 상황이 필요. 그럴때 shutdown 함수 사용.

Half-close 기반의 파일 전송 프로그램




*애매한게 있었는데 EOF를 던진다는 것은 사실은 -1을 던진다는 것이고 read 의 경우 EOF를  받게 되면 return을 0을 한다.