본문 바로가기
C_C++ 프로그래밍/boost

[boost asio] 동기식 echo 채팅 클라이언트

by RoJae 2019. 7. 31.

 

     로재의 개발 일기      

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는 참 좋은 것 같다.

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





댓글