반응형
개요
원시 IP 주소는 사람이 기억하기 매우 불편하다. 특히 16진수를 사용하는 IPv6의 경우에는 더욱 그렇다.
숫자들과 낱말들이 의미 없이 나열된 문자열을 기억한다는 것은 보통 일이 아니다.
네트워크에 있는 기기에 사람이 기억하기 쉬운 이름을 붙여주기 위해 DNS를 사용한다.
www.naver.com이나 www.google.com과 같은 링크는 쉽게 기억할 수 있는 이유이다.
DNS는 하나 또는 그 이상의 IP 주소에 대한 별칭이다.
DNS가 가리키는 IP 주소가 무엇인지 물어볼 수 있도록 하는 인터페이스를 제공한다.
DNS의 이름을 IP 주소로 바꾸는 과정을 DNS 이름 해석이라고 부른다.
DNS 이름 해석기 (resolver)
- 서버 프로그램을 가르키는 DNs 이름과 프로토콜 포트 번호를 얻고 문자열로 표현한다.
- asio::io_service 클래스의 인스턴스를 생성한다.
- DNS 이름 해석 질의를 나타내는 클래스인 resolver::query의 객체를 생성한다.
- 원하는 프로토콜에 적합한 DNS 이름 해석기의 인스턴스를 생성한다.
- 해석기의 reselove() 메서드를 통해 3단계에서 행성한 질의 객체를 인자로 전달한다.
#include <boost/asio.hpp>
#include <iostream>
using namespace boost;
int main()
{
// Step 1. 연결한 서버 프로그램의 DNs 이름과 포트번호를 문자열로 갖고 있다고 가정
std::string host = "samplehost.com";
std::string port_num = "3333";
// Step 2.
asio::io_service ios;
// Step 3. 질의 생성
asio::ip::tcp::resolver::query resolver_query(host,
port_num, asio::ip::tcp::resolver::query::numeric_service);
// Step 5. 해석기 생성
asio::ip::tcp::resolver resolver(ios);
// 오류 정보 용
boost::system::error_code ec;
// Step 6.
asio::ip::tcp::resolver::iterator it =
resolver.resolve(resolver_query, ec);
if (ec != 0) {
// DNS 이름을 해석하지 못한 경우
std::cout << "Failed to resolve a DNS name. Error code = "
<< ec.value() << ". Message = " << ec.message();
return ec.value();
}
asio::ip::tcp::resolver::iterator it_end;
for (; it != it_end; ++it) {
// 종료점에 접근하기
asio::ip::tcp::endpoint ep = it->endpoint();
}
return 0;
}
asio::ip::tcp::resolver::iterator
성공적으로 DNS 이름을 해석하였다면, 위 클래스를 반환하게 된다.
이는 해석 결과를 나타내는 모음의 첫 번째 요소를 가르키는 이터레이터이다.
서버 프로그램이 실행되고 있는 호스트의 DNS 이름을 해석하면 대체로 하나 이상의 IP 주소가 나온다. 따라서 종료점도 하나 이상 생성된다.
해석 과정 동안 알아낸 IP 주소의 개수에 맞는 객체가 저장되어 있다.
각 요소에는 1개의 IP 주소와 query 객체에서 제공한 포트 번호로 인스턴스화된 endpoint 객체가 저장된다.
DNS 이름이 하나 이상의 IP 주소로 해석됐는데, 일부는 IPv4이고, 나머지는 IPv6일 수도 있다.
UDP 또한 TCP와 동일하며 asio::ip::tcp 대신 asio::ip::udp를 사용해 주면 된다.
728x90
반응형
'네트워크 통신 > Boost' 카테고리의 다른 글
Boost.asio 소켓 연결 수락 (0) | 2024.11.07 |
---|---|
Boost.asio 소켓 연결 요청 (2) | 2024.11.07 |
Boost.asio 소켓 바인딩 (0) | 2024.11.07 |
Boost.asio 능동/수동 소켓 만들기 (0) | 2024.11.07 |
Boost.asio 종료점 만들기 (0) | 2024.11.07 |