[C++/Boost] 소켓 쏴보기

서버가 클라이언트가 쏜 텍스트를 받아먹고 콘솔에 띄우는 간단한 프로그램을 작성해본다.

서버 코드다.

#include <iostream>
#include <string>
#include <boost/asio.hpp>
//서버

namespace asio = boost::asio;
using boost::asio::ip::tcp;

constexpr auto port = 56789;

int main()
{
	std::locale::global(std::locale(""));

	std::cout << "## server is running ##" << std::endl;

	asio::io_service io; //필수
	auto server_address = tcp::endpoint(tcp::v4(), port);

	//리스너
	auto listener = tcp::acceptor(io, server_address);

	//버퍼. 길이 고정이어야 함.
	char input[100];

	while(true)
	{
		auto socket = listener.accept(); //신호 올때까지 블럭
		std::cout << "클라이언트 접속됨" << std::endl;

		socket.read_some(asio::buffer(input));
		socket.close();
		std::cout << "클라이언트 say: " << input << std::endl;
	}
}

클라이언트 코드다.
한번만 쏘고 만다.

#include <locale>
#include <string>
#include <boost/asio.hpp>

namespace asio = boost::asio;
using boost::asio::ip::tcp;

constexpr auto ip_address = "127.0.0.1";
constexpr auto port = 56789;

int main()
{
	std::locale::global(std::locale(""));
	asio::io_service io; //필수

	auto end_point = tcp::endpoint(asio::ip::make_address(ip_address), port);

	tcp::socket socket(io);
	socket.connect(end_point);
	char output[] = "hello";
	socket.write_some(asio::buffer(output));
	socket.close();

    return 0;
}

서버 코드 돌려놓고
클라이언트 실행할때마다 hello를 보내주게 되어있다.

대강 이렇게 뜨면 성공이다.


그리고 왜인지는 모르겠는데, 클라이언트 측에서 데이터를 std::string으로 쓰려니까 자꾸 널문자가 증발해서 텍스트가 깨진다. 텍스트 리터럴 내에 널문자를 명시해도 안 된다.