[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으로 쓰려니까 자꾸 널문자가 증발해서 텍스트가 깨진다. 텍스트 리터럴 내에 널문자를 명시해도 안 된다.
