본문 바로가기
일상,취미

다시 시작하는 TIL 19일차

by 진득한진드기 2024. 7. 3.

오늘 한일

 

오늘은 장마 첫날이라 아침부터 굉장히 피곤했다.

 

아침부터 기기를 변경하니까 연결된 기기에 해상도가 달라지니 좌표 데이터를 저장한게 예외케이스가 나타났다.

 

x,y좌표가 기존보다 커지니까 하드 코딩해놨던 부분에서 메모리 접근을 잘못했다는 오류가 떴다.

 

기기가 고정된 상태로 테스트 했는데 생각보다 엄청 큰 해상도에서 올거라고 생각을 못했다.

 

어찌저찌 예외처리나는 부분을 예외처리를 해서 해상도 간격을 맞추고 점심을 먹었다.

 

근데 점심시간 끝나고 갑자기 오늘은 장마 첫날이니 조기퇴근을 하라는 사장님의 명령......ㅎ 

 

덕분에 하루가 후딱 지나갔다. ㅋㅎㅎㅋㅎㅋ

 

퇴근 후 공부

 

도메인 이름

 

IP를 대신하는 서버의 주소
실제 접속에 사용되는 주소는 아니다. 이 정보는 IP로 변환 되어야 접속이 가능하다.

 
DNS서버 

 

도메인 이름을 IP로 변환해주는 서버
DNS는 일종의 분산 데이터베이스 시스템이다.

도메인 이름을 이용해서 서버에 접속하면, 접속 이전에 DNS 서버에 해당 도메인의 IP 주소를 묻게 되고, 그 결과로 얻게 된 IP를 이용해서 서버에 접속하게 된다.


호스트에서 요청을 보낼 때 게이트웨이를 거치게 되는데 게이트웨이를 간단하게 생각하면 라우터라고 생각하면 된다.

DNS서버는 하나도 이루어져있는게 아니라 DNS서버가 해당 그 도메인을 가지고 있는지 질의는 할 수 있어야함.

결국 root DNS 서버까지 가도 없을수도있다 root는 어디에있는지 확인이 가능하기에 결과를 얻어낸 계층 방향에서 역방향으로 돌아와 ip를 얻게 된다.

 

 

DNS기반의 함수를 배워보자

 

IP주소를 도메인 이름으로 변환 함수

 

단순히 도메인이름을 얻는게 아니라 해당 도메인의 모든 정보를 얻어오는것이다

hostnet의 구조

struct hostnet
{
char* h_name;
char ** h_aliases;
int h_addrtype;
int h_length;
char ** h_addr_list;

}

h_name : 공식 도메인이름
h_aliases : 별칭의 도메인 이름
h_addrtype : 반환된 IP의 정보가 IPv4인 경우, AF_INET이 반환
h_length : 반환된 IP정보의 크기 ,IPv4인 경우 4, IPv6인 경우 16이 저장
h_addr_list : IP의 주소정보, 둘 이상의 경우 모두반환

 

왜 h_addr_list는 정수형태인데 char 이중포인터로 선언했는가

 

이는 IPv4이거나 IPv6의 데이터 둘다 사용이 가능하므로 이거는 하나의 버퍼로 바라봐야한다. 

4바이트, 16바이트 둘다 올수있기 때문에 바이트의 열로 봐야한다.

바이트형은 char형으로 역사적으로 그렇게 선언하기 때문이다.

현재는 void 포인터형으로 선언을 많이 한다.



gethostbyname 함수의 인자로 도메인의 이름정보를 전달하면, 해당 도메인의 서버정보가 hostet 구조체 변수에 채워지고, 그 변수의 주소값이 반환됨.

IP는 도메인 이름에 비해 상대적으로 변동이 심하다. 때문에 프로그램 코드상에서 서버의 IP를 직접 코드로 입력한다면, 서버의 IP가 변경될 떄 마다 컴파일을 다시 해야하는 번거로운 상황이 발생한다. 그러나 상대적으로 변동이 덜한 도메인 이름을 이용해서 서버가 실행될 때마다 IP를 얻어오게 구현한다면, 서버의 코드를 재 컴파일 할 필요가 없다.

 

도메인 이름을 IP주소로 변환 하는 함수

 

struct hostnet p_gethostbyname(const char p_hostname);

 

도메인 이름을 이용해서 IP주소로 바꾸는게 아니라 해당 도메인을 이용해서 해당 도메인의 모든 시스템 정보를 얻어오는 방식이다.

 

struct hostent p_gethostbyaddr(const char p_addr, socklen_t len, int family);

addr = IP주소를 지니는 in_addr 구조체 변수의 포인터 전달, IPv4 이외의 다양한 정보를 전달받을 수 있도록 일반화하기 위해 매개변수를 char형 포인터로 선언

len = 첫 번째 인자로 전달된 주소정보의 길이, IPv4의 경우, IPv6의 경우 16전달

family = 주소체계 정보 전달. IPv4의 경우 AF_INET, IPv6 의 경우 AF_INET6 전달

'일상,취미' 카테고리의 다른 글

다시 시작하는 TIL 21일차  (0) 2024.07.05
다시 시작하는 TIL 20일차  (0) 2024.07.04
다시 시작하는 TIL 18일차  (0) 2024.07.02
다시 시작하는 TIL 17일차  (0) 2024.06.29
다시 시작하는 TIL 16일차  (0) 2024.06.28