본문 바로가기

카테고리 없음

boost.asio란?

Boost.Asio는 C++에서 동기 및 비동기 방식의 네트워크 및 저수준 I/O 프로그래밍을 위한 강력한 라이브러리입니다. Boost 라이브러리의 일부로, TCP/UDP 소켓, 직렬 포트, 타이머 등 다양한 I/O 기능을 제공합니다.


---

🧠 개요: Boost.Asio로 할 수 있는 것들

TCP/UDP 소켓 통신 (클라이언트/서버)

타이머 (deadline timer, steady timer 등)

직렬 포트 통신

SSL 통신 (OpenSSL과 연동)

동기 및 비동기 I/O 처리



---

🚀 기본 개념 정리

io_context (또는 io_service): 모든 비동기 작업의 실행 컨텍스트.

socket: TCP/UDP 등의 네트워크 소켓.

resolver: DNS 이름 해석.

acceptor: 서버에서 클라이언트 연결을 수락.

async_* 함수들: 비동기 처리를 위한 함수들.

핸들러 (callback): 비동기 작업이 끝났을 때 호출되는 함수.



---

✅ TCP 서버 예제 (동기 방식)

#include <boost/asio.hpp>
#include <iostream>

using boost::asio::ip::tcp;

int main() {
    boost::asio::io_context io;

    // 1234 포트에서 대기
    tcp::acceptor acceptor(io, tcp::endpoint(tcp::v4(), 1234));

    std::cout << "Waiting for connection..." << std::endl;

    tcp::socket socket(io);
    acceptor.accept(socket);  // 클라이언트 연결 대기 (blocking)

    std::cout << "Client connected!" << std::endl;

    std::string message = "Hello from server!";
    boost::system::error_code ec;
    boost::asio::write(socket, boost::asio::buffer(message), ec);

    if (!ec)
        std::cout << "Message sent." << std::endl;
    else
        std::cout << "Error: " << ec.message() << std::endl;

    return 0;
}


---

✅ TCP 클라이언트 예제 (동기 방식)

#include <boost/asio.hpp>
#include <iostream>

using boost::asio::ip::tcp;

int main() {
    boost::asio::io_context io;

    tcp::resolver resolver(io);
    auto endpoints = resolver.resolve("127.0.0.1", "1234");

    tcp::socket socket(io);
    boost::asio::connect(socket, endpoints);

    std::cout << "Connected to server!" << std::endl;

    char data[1024];
    size_t len = socket.read_some(boost::asio::buffer(data));

    std::cout << "Received: " << std::string(data, len) << std::endl;

    return 0;
}


---

🔁 비동기 방식의 핵심 흐름

비동기 처리에서는 다음 패턴을 따릅니다:

1. io_context 객체 생성


2. 비동기 함수 호출 (e.g., async_accept, async_read)


3. 핸들러(callback)에서 작업 처리


4. io_context.run() 호출하여 I/O 이벤트 루프 실행




---

💡 참고 팁

비동기 작업을 위해서는 run() 루프가 계속 돌아야 하므로 스레드나 이벤트 루프와 함께 사용하는 것이 반적입니다.

실제 서비스에서는 strand를 사용하여 동기화 문제를 피합니다.

SSL 소켓을 다룰 땐 boost::asio::ssl::stream을 사용해야 합니다.



---

📚 추가 자료

공식 문서: https://www.boost.org/doc/libs/release/doc/html/boost_asio.html

실전 예제: Boost.Asio examples 디렉토리

책 추천: C++ Network Programming 시리즈



---

원하는 게 TCP 서버/클라이언트, UDP, 비동기 구조, 또는 SSL 통신인지 구체적으로 알려주시면 더 자세한 예제를 드릴 수 있어요.