boost.asio를 이용한 TCP 동기식 통신

2019. 8. 31. 12:00PL/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