ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [boost asio] 동기식 echo 채팅 클라이언트
    C_C++ 프로그래밍/boost 2019. 7. 31. 21:02

     

         로재의 개발 일기      

    boost asio

    asio의 서버 부분 소스코드에 이어서 client 부분도 설명을 이어서 진행하겠다.



     synchronous_client.cpp

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    #include <boost/asio.hpp>
    #include <iostream>
     
    #pragma warning (disable : 4996)
     
    constexpr char SERVER_IP[] = "127.0.0.1";
    constexpr unsigned short PORT_NUMBER = 1234;
     
    int main() {
        boost::asio::io_service io_service;
        boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::address::from_string(SERVER_IP),
            PORT_NUMBER);
     
        boost::system::error_code connect_error;
        boost::asio::ip::tcp::socket socket(io_service);
        socket.connect(endpoint, connect_error);
     
        if (connect_error) {
            std::cout << "Connection fail. error No: " << connect_error.value()
                << ", Message: " << connect_error.message() << std::endl;
        }
        else {
            std::cout << "Connection Success" << std::endl;
        }
     
        while (1
        {
            char message[128= { 0, };
            std::cin >> message;
            int nMsgLen = strnlen_s(message, 128 - 1);
            boost::system::error_code ignored_error;
            socket.write_some(boost::asio::buffer(message, nMsgLen), ignored_error);
     
            std::cout << "Sent Message: " << message << std::endl;
     
            std::array<char128> buf;
            buf.assign(0);
            boost::system::error_code error;
            size_t len = socket.read_some(boost::asio::buffer(buf), error);
     
            if (error) {
                if (error == boost::asio::error::eof) {
                    std::cout << "Connection cut off" << std::endl;
                }
                else {
                    std::cout << "Error No: " << error.value() << "error Message: "
                        << error.message().c_str() << std::endl;
                }
                break;
            }
            std::cout << "Server Message: " << &buf[0<< std::endl;
        }
        if (socket.is_open()) {
            socket.close();
        }
        getchar();
        return 0;
    }
    cs




    1
    2
    3
    boost::asio::io_service io_service;
    boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::address::from_string(SERVER_IP),
        PORT_NUMBER);
    cs

    서버와 마찬가지로 io_service를 설정해준다.

    하지만, endpoint의 경우에는 조금 다른데, 접속할 서버의 IP는 문자열로 받아들이도록 from_string

    클래스를 사용하였다.



    1
    2
    3
    4
    5
    6
    7
    if (connect_error) {
        std::cout << "Connection fail. error No: " << connect_error.value()
            << ", Message: " << connect_error.message() << std::endl;
    }
    else {
        std::cout << "Connection Success" << std::endl;
    }
    cs

    서버에서 받은 데이터의 error 유무를 확인하는 부분이다.



    1
    2
    3
    if (socket.is_open()) {
            socket.close();
    }
    cs

    사실 이 부분은 로직상으로 필요가 없는 부분이지만, getchar와 더불어...

    소스코드를 수정하다보니 부득이하게 남게 되었다.

    이 부분은 서버와 연결이 되면 안되는 경우 ( 클라이언트의 일방적인 종료 등등.. )

    에 사용이 된다.




     결과



    마무리

    boost asio는 참 좋은 것 같다.

    ※ 본 글은 개인 포트폴리오 혹은 공부용으로 사용하기 때문에, 무단 복사 유포는 금지하지만, 개인 공부 용도로는 얼마든지 사용하셔도 좋습니다





    반응형
Designed by Tistory.