본문 바로가기
Unreal/C++ 서버

C++, Visual Studio를 활용한 Boost.Asio 설치 및 실행 테스트 코드 설명

by 보안매크로 2024. 2. 24.
728x90
#include <iostream>: 표준 입력과 출력을 위한 라이브러리를 포함합니다.
#include <boost/asio.hpp>: Boost.Asio 라이브러리를 포함합니다. Asio는 네트워크 및 비동기 I/O 작업을 위한 라이브러리입니다.
 
using namespace boost::asio;
using namespace boost::asio;: Boost.Asio 네임스페이스를 사용합니다. 이는 io_service, ip::tcp, buffer 등의 클래스와 함수를 사용할 때 boost::asio::를 생략할 수 있도록 해줍니다.
 
class TCPServer {
public:
    TCPServer(io_service& io_service, short port)
        : acceptor_(io_service, ip::tcp::endpoint(ip::tcp::v4(), port)),
          socket_(io_service) {
        StartAccept();
    }
class TCPServer { ... }: TCPServer 클래스를 정의합니다.
io_service& io_service, short port: io_service와 포트 번호를 매개변수로 받는 생성자를 정의합니다.
: acceptor_(io_service, ip::tcp::endpoint(ip::tcp::v4(), port)), socket_(io_service): 초기화 리스트를 사용하여 acceptor_와 socket_ 멤버 변수를 초기화합니다.
StartAccept();: StartAccept 멤버 함수를 호출하여 클라이언트의 연결을 기다리도록 합니다.
 
private:
    void StartAccept() {
        acceptor_.async_accept(socket_,
            [this](boost::system::error_code ec) {
                if (!ec) {
                    std::cout << "Client connected: " << socket_.remote_endpoint() << std::endl;
                    StartRead();
                }
                StartAccept();
            });
    }
private:: 이후에 나오는 멤버 함수 및 변수들은 클래스의 private 영역에 속합니다.
void StartAccept() { ... }: StartAccept 멤버 함수를 정의합니다.
acceptor_.async_accept(socket_, [this](boost::system::error_code ec) { ... });: 비동기적으로 클라이언트의 연결을 받아들이기 위해 async_accept 함수를 호출합니다. 람다 함수가 클라이언트 연결을 처리합니다.
if (!ec) { ... }: 에러 코드 ec가 없으면 (즉, 성공하면) 다음 코드 블록을 실행합니다.
std::cout << "Client connected: " << socket_.remote_endpoint() << std::endl;: 클라이언트가 연결되면 클라이언트의 IP 주소를 출력합니다.
StartRead();: 클라이언트 연결이 성공하면 데이터를 읽기 위해 StartRead 함수를 호출합니다.
StartAccept();: 다음 클라이언트 연결을 받아들이기 위해 StartAccept 함수를 재귀적으로 호출합니다.
 
    void StartRead() {
        async_read(socket_,
            buffer(data_),
            [this](boost::system::error_code ec, std::size_t length) {
                if (!ec) {
                    std::cout << "Received data: " << data_ << std::endl;
                    StartRead();
                }
                else {
                    std::cout << "Client disconnected: " << socket_.remote_endpoint() << std::endl;
                    StartAccept(); // Add this line to accept new connections after client disconnects
                }
            });
    }
void StartRead() { ... }: StartRead 멤버 함수를 정의합니다.
async_read(socket_, buffer(data_), [this](boost::system::error_code ec, std::size_t length) { ... });: 비동기적으로 소켓에서 데이터를 읽기 위해 async_read 함수를 호출합니다. 람다 함수가 데이터를 처리합니다.
if (!ec) { ... }: 에러 코드 ec가 없으면 (즉, 성공하면) 다음 코드 블록을 실행합니다.
std::cout << "Received data: " << data_ << std::endl;: 데이터를 받으면 받은 데이터를 출력합니다.
StartRead();: 다음 데이터를 읽기 위해 StartRead 함수를 재귀적으로 호출합니다.
else { ... }: 에러가 발생했을 때 다음 코드 블록을 실행합니다.
std::cout << "Client disconnected: " << socket_.remote_endpoint() << std::endl;: 클라이언트가 연결을 끊으면 클라이언트의 IP 주소를 출력합니다.
StartAccept(); // Add this line to accept new connections after client disconnects: 클라이언트가 연결을 끊으면 다음 클라이언트 연결을 받아들이기 위해 StartAccept 함수를 호출합니다.
 
    ip::tcp::acceptor acceptor_;
    ip::tcp::socket socket_;
    std::string data_;
};
ip::tcp::acceptor acceptor_;: TCP 연결을 받아들이는 객체를 나타내는 acceptor_ 멤버 변수입니다.
ip::tcp::socket socket_;: TCP 소켓을 나타내는 socket_ 멤버 변수입니다.
std::string data_;: 수신된 데이터를 저장하는 data_ 멤버 변수입니다.
 
# main 함수
int main() {
    try {
        io_service io_service;
        TCPServer server(io_service, 12345);
        std::cout << "Server started. Listening on port 12345..." << std::endl;
        io_service.run();
    }
    catch (
728x90

'Unreal > C++ 서버' 카테고리의 다른 글

Mongocxx Driver 설치  (0) 2024.03.16
mongocxx(v3) 드라이버 제거 방법  (0) 2024.03.09
비동기적 서버란?  (0) 2024.02.25
C++, Visual Studio를 활용한 Boost.Asio 설치 및 실행  (0) 2024.02.18
소켓을 생성한다는 것은?  (1) 2023.12.22