boost.asio를 이용한 TCP 동기식 통신
2019. 8. 31. 12:00ㆍPL/C++
[서버]
#define _CRT_SECURE_NO_WARNINGS
#include <ctime>
#include <string>
#include <iostream>
#include <boost/asio.hpp>
using boost::asio::ip::tcp;
std::string make_daytime_string()
{
using namespace std; // For time_t, time and ctime;
time_t now = time(0);
return ctime(&now);
}
int main()
{
try
{
// 반드시 boost.asio를 사용하면 선언
boost::asio::io_service io_service;
// boost.asio가 간편한 점은 서버에서 bind, listen을 다음과 같이 생략할 수 있다
// IPv4 주소체계를 사용하고, 13번 포트를 사용한다. 범용적으로 13번 포트는 daytime 프로토콜이다
tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), 13));
for (;;)
{
// 클라이언트를 받을 소켓을 선언
tcp::socket socket(io_service);
// 여기 부분에서 blocking되어서 연결을 기다린다
acceptor.accept(socket);
// 시간 정보를 받아온다
std::string message = make_daytime_string();
// 클라이언트에 정보 전달
boost::system::error_code ignored_error;
boost::asio::write(socket, boost::asio::buffer(message), ignored_error);
}
}
catch (std::exception& e)
{
std::cerr << e.what() << std::endl;
}
return 0;
}
[클라이언트]
#include <iostream>
#include <boost/array.hpp>
#include <boost/asio.hpp>
using boost::asio::ip::tcp;
int main(int argc, char* argv[])
{
try
{
// boost.asio에서는 반드시 io_service 객체를 선언한다
boost::asio::io_service io_service;
// DNS를 사용하기 위한 절차
// resolve("DNS 주소", "포트")
tcp::resolver resolver(io_service);
tcp::resolver::results_type endpoints =
resolver.resolve("localhost", "daytime");
// 서버와 연결할 소켓 생성
tcp::socket socket(io_service);
boost::asio::connect(socket, endpoints);
for (;;)
{
boost::array<char, 128> buf;
boost::system::error_code error;
// 정보를 받아와서
size_t len = socket.read_some(boost::asio::buffer(buf), error);
if (error == boost::asio::error::eof) {
break; // Connection closed cleanly by peer.
}
else if (error)
throw boost::system::system_error(error); // Some other error.
// 화면에 출력
std::cout.write(buf.data(), len);
}
}
catch (std::exception& e)
{
std::cerr << e.what() << std::endl;
}
return 0;
}
[참고] https://www.boost.org/doc/libs/1_66_0/doc/html/boost_asio/tutorial.html
'PL > C++' 카테고리의 다른 글
오목 게임 화면 구성 (0) | 2019.09.01 |
---|---|
C# 2차원 배열 구성해서 출력하기 (0) | 2019.09.01 |
오목 시작 화면 구성하기 (0) | 2019.08.30 |
stack, queue 클래스로 간단히 구현하기 (0) | 2019.08.25 |
c++ 클래스 상속의 조건 (0) | 2019.08.25 |