반응형
개요
능동 소켓으로 원격 프로그램과 통신하거나 수동 소켓으로 들어오는 연결 요청을 받으려고 하기 전에, 소켓은 실제 IP 주소와 프로토콜 포트 번호, 즉 종료점에 묶어야 한다.
소켓을 특정 종료점과 묶는 과정을 바인딩이라고 한다.
소켓이 종료점에 바인딩 되면, 운영체제가 네트워크에서 호스트의 해당 종료점으로 들어오는 모든 네트워크 패킷을 특정 소켓으로 전달한다.
이와 반대로 종료점에 연결된 소켓에서 나가는 모든 데이터는 종료점이 나타내는 IP 주소의 네트워크로 송출된다.
클라이언트 프로그램은 자신의 능동 소켓과 바인딩할 IP 주소 및 프로토콜 포트 번호에 크게 신경쓰지 않지만, 서버 프로그램은 특정 종료점을 명시적으로 자신의 수용자 소켓과 바인딩해야 한다.
서버의 종료점은 자신과 통신하기를 원하는 클라이언트가 알아야만 하고, 서버 프로그램이 재시작하더라도 같은 상태에 머물러 있어야 한다.
수동 소켓 종료점 바인딩
- 서버가 들어오는 연결 요청이 있는지 확인할 프로토콜 포트 번호를 얻는다.
- 호스트에서 사용할 수 있는 모든 IP 주소와 1번에서 얻은 프로토콜 포트 번호를 나타내는 종료점을 만든다.
- 수용자 소켓을 만들고 연다.
- 종료점 객체를 인자로 전달함, 수용자 소켓의 bind() 메서드를 호출한다.
#define BOOST_DISABLE_CURRENT_LOCATION
#include <boost/asio.hpp>
#include <iostream>
using namespace boost;
int main()
{
// Step 1. 서버 프로그램이 사용할 프로토콜 포트 번호를 알고 있다고 가정
unsigned short port_num = 3333;
// Step 2. 모든 IP에 대한 종료점을 만든다.
asio::ip::tcp::endpoint ep(asio::ip::address_v4::any(), port_num);
// io_service 인스턴스 생성
asio::io_service ios;
// Step 3. 수동 소켓을 만든다.
asio::ip::tcp::acceptor acceptor(ios, ep.protocol());
boost::system::error_code ec;
// Step 4. 수동 소켓을 바인딩한다.
acceptor.bind(ep, ec);
// 에러 핸들링
if (ec.value() != 0) {
// 수동 소켓 바인드 하지 못했다면
std::cout << "Failed to bind the acceptor socket."
<< "Error code = " << ec.value() << ". Message: "
<< ec.message();
return ec.value();
}
return 0;
}
이전 글에서 언급한 적이 있지만 UDP 서버는 연결을 수립할 수 없으므로 수동 소켓은 TCP 프로토콜에서만 작동한다.
728x90
반응형
'네트워크 통신 > Boost' 카테고리의 다른 글
Boost.asio 소켓 연결 수락 (0) | 2024.11.07 |
---|---|
Boost.asio 소켓 연결 요청 (2) | 2024.11.07 |
Boost.asio DNS 이름 해석하기 (1) | 2024.11.07 |
Boost.asio 능동/수동 소켓 만들기 (0) | 2024.11.07 |
Boost.asio 종료점 만들기 (0) | 2024.11.07 |