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<char, 128> 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는 참 좋은 것 같다.
※ 본 글은 개인 포트폴리오 혹은 공부용으로 사용하기 때문에, 무단 복사 유포는 금지하지만, 개인 공부 용도로는 얼마든지 사용하셔도 좋습니다
'C_C++ 프로그래밍 > boost' 카테고리의 다른 글
[boost asio] 동기식 echo 채팅 서버 (0) | 2019.07.31 |
---|---|
[boost] 윈도우에 boost를 설치해보자 (0) | 2019.07.11 |
[boost] boost란 무엇인가? (0) | 2019.07.11 |
댓글