개요
일반적인 클라이언트 어플리케이션이 서비스를 제공하는 서버 프로그램과 통신하려면, 서버 프로그램이 실행되고 있는 호스트의 IP 주소와 프로토콜 포트 번호를 알아야 한다.
IP 주소와 프로토콜 포트 번호라는 한 쌍의 값으로 네트워크상의 특정 호스트에서 실행되고 있는 한 프로그램을 지정할 수 있다.
그런 한 쌍의 값을 종료점이라고 부른다.
일반적으로 서버 프로그램의 IP 주소와 포트 번호를 사용자로부터 직접 입력 받거나, 프로그램의 구성 파일에서 알아낸다.
IP주소가 IPv4라면, 숫자와 마침표로 이뤄진 문자열로 표시한다.
IPv6라면 16진법에 따른 문자열로 표시한다.
서버 IP 주소는 DNS를 통해 좀 더 간접적으로 표시하기도 한다.
클라이언트 뿐만 아니라 서버 프로그램 역시 종료점을 다뤄야 한다.
서버 프로그램은 클라이언트로부터 들어오는 메시지를 기다릴 IP 주소와 프로토콜 포트 번호를 운영체제에 미리 알려야 한다.
만약 서버 프로그램이 실행되고 있는 호스트에 네트워크 인터페이스가 하나뿐이고, IP 주소도 하나만 할당되어 있다면 서버프로그램이 사용할 수 있는 주소도 그것 뿐이다.
클라이언트 종료점 만들기
- 서버 프로그램의 IP 주소와 포트 번호를 얻는다.
- asio::ip::address 클래스의 객체로 원시 IP 주소를 표현한다.
- 2단계에서 만든 주소 객체와 포트 번호로 asio::ip::tcp::endpoint 클래스를 인스턴스화한다.
- 이제 Boost.asio 통신 관련 메서드를 사용할 때 서버 프로그램을 가리키도록 할 수 있다.
#include <boost/asio.hpp>
#include <iostream>
using namespace boost;
int main()
{
// Step1. 서버 IP 주소와 포트 번호를 이미 알고있다고 가정
std::string raw_ip_address = "127.0.0.1";
unsigned short port_num = 12345;
// 오류 정보 저장용
boost::system::error_code ec;
// Step2. IP 프로토콜 버전과 관계 없는 주소 형식 사용
asio::ip::address ip_address =
asio::ip::address::from_string(raw_ip_address, ec);
if (ec.value() != 0) {
// IP 주소가 유효하지 않을 경우
std::cout
<< "Failed to parse the IP address. Error code = "
<< ec.value() << ". Message: " << ec.message();
return ec.value();
}
// Step 3.
asio::ip::tcp::endpoint ep(ip_address, port_num);
return 0;
}
서버 종료점 만들기
- 요청이 들어오는지 듣고있을 프로토콜 포트 번호를 알아낸다.
- 서버가 실행되고 있는 호스트가 쓸 수 있는 모든 IP 주소를 나타내는 인스턴스를 만든다.
- 2단계에서 생성한 주소 객체와 포트 번호로 endpoint클래스의 객체를 인스턴스화한다.
- 이제 서버가 이 종료점을 통해 모든 IP 주소와 특정 프로토콜 포트 번호로 들어오는 메시지를 읽기 원한다고 운영체제에 알려주기 위한 모든 준비가 끝났다.
#include <boost/asio.hpp>
#include <iostream>
using namespace boost;
int main()
{
// Step 1. 서버 프로그램이 사용할 프로토콜 포트 번호를 알고 있다고 가정
unsigned short port_num = 3333;
// Step 2. 호스트에서 쓸 수 있는 모든 IP 주소를 나타내는 클래스 객체 생성
asio::ip::address ip_address = asio::ip::address_v4::any();
// Step 3.
asio::ip::tcp::endpoint ep(ip_address, port_num);
return 0;
}
asio::ip::address
- asio::ip::address_v4 : IPv4 주소를 나타낸다.
- asio::ip::address_v6 : IPv6 주소를 나타낸다.
- asio::ip::address : IP-프로토콜 버전 무관 클래스, IPv4, IPv6 주소 모두 표현 가능
- from_string(string, error_code) : 전달받은 문자열이 유효한 주소인지 검증하고 아니라면 error_code 리턴
- any() : 호스트에서 사용할 수 있는 모든 IP 주소라는 개념을 나타내는 정적 메서드 (asio::ip::address는 any() 메서드를 제공하지 않는다, v4, v6만 제공)
boost::asio::ip::tcp::endpoint
IP 주소와 프로토콜 포트 번호를 전달해 객체를 인스턴스화 한다.
이제 ep객체를 사용하면 Boost.asio 통신 관련 함수 내에서 서버 프로그램을 가리킬 수 있다.
class tcp
{
public:
/// The type of a TCP endpoint.
typedef basic_endpoint<tcp> endpoint;
728x90
'소켓 통신 > Boost' 카테고리의 다른 글
Boost.asio 소켓 연결 수락 (0) | 2024.11.07 |
---|---|
Boost.asio 소켓 연결 요청 (2) | 2024.11.07 |
Boost.asio 소켓 바인딩 (0) | 2024.11.07 |
Boost.asio DNS 이름 해석하기 (1) | 2024.11.07 |
Boost.asio 능동/수동 소켓 만들기 (0) | 2024.11.07 |