[Network] 10. FlatBuffers + Boost Asio 콘솔 클라이언트 예제 (2)
프로그래밍 언어/Flatbuffers2021. 7. 11. 12:04
이제 마지막으로 클라이언트 코드의 main 함수부분에 대해서 마지막으로 작성하도록 하겠습니다.
중요한 건 main 코드 부분의 flatbuffers를 패킷 직렬화하는 방법에 대해서 중점적으로 보시면 되겠습니다.
stdafx.h
#pragma once
#include <SDKDDKVer.h>
#include <iostream>
#include <deque>
#include <cstdlib>
#include <boost/bind/bind.hpp>
#include <boost/asio.hpp>
#include <boost/thread.hpp>
#include "Message.h"
#include "flatbuffers/flatbuffers.h"
#include "protocol_generated.h"
using namespace std;
using boost::asio::ip::tcp;
간단히 주석으로 설명을 해두었습니다. 어려운 코드는 아니라서 코드리뷰 해보시고 이해해보시기 바랍니다.
main.cpp
#include "stdafx.h"
#include "ChatClient.h"
#define HOST_IP "127.0.0.1"
#define PORT_NUMBER "31400"
int main()
{
try
{
boost::asio::io_context io_context;
tcp::resolver resolver(io_context);
CChatClient Client(io_context, resolver.resolve(HOST_IP, PORT_NUMBER));
std::thread t([&io_context]() { io_context.run(); });
char szInput[CMessage::max_body_length + 1] = { 0, };
while (std::cin.getline(szInput, CMessage::max_body_length + 1))
{
// 키보드 입력값이 없는 경우 종료 코드
if (strnlen_s(szInput, CMessage::max_body_length + 1) == 0)
{
flatbuffers::FlatBufferBuilder builder;
auto data = fbs::CreateC2S_LEAVE_REQ(builder);
auto root = fbs::CreateRoot(builder, fbs::Packet_C2S_LEAVE_REQ, data.Union());
builder.Finish(root);
Client.Write(CMessage(builder.GetBufferPointer(), builder.GetSize()));
Sleep(500); // 객체가 패킷보다 먼저 삭제되는것을 방지
break;
}
if (Client.IsConnect() == false)
{
std::cout << "서버와 연결되지 않았습니다!" << std::endl;
continue;
}
// 접속 요청 패킷 전송
if (Client.GetLogin() == false)
{
flatbuffers::FlatBufferBuilder builder;
auto name = builder.CreateString(szInput);
auto data = fbs::CreateC2S_CONNECT_REQ(builder, name);
auto root = fbs::CreateRoot(builder, fbs::Packet_C2S_CONNECT_REQ, data.Union());
builder.Finish(root);
Client.Write(CMessage(builder.GetBufferPointer(), builder.GetSize()));
}
else // 채팅 패킷전송
{
flatbuffers::FlatBufferBuilder builder;
auto message = builder.CreateString(szInput);
auto data = fbs::CreateC2S_CHAT_REQ(builder, message);
auto root = fbs::CreateRoot(builder, fbs::Packet_C2S_CHAT_REQ, data.Union());
builder.Finish(root);
Client.Write(CMessage(builder.GetBufferPointer(), builder.GetSize()));
}
}
io_context.stop();
Client.Close();
t.join();
}
catch (std::exception& e)
{
std::cerr << "Exception: " << e.what() << "\n";
}
return 0;
}
'프로그래밍 언어 > Flatbuffers' 카테고리의 다른 글
[Network] 12. FlatBuffers + Asio MFC 채팅서버 구조 (0) | 2021.10.01 |
---|---|
[Network] 11. FlatBuffers + Boost Asio 콘솔 채팅서버 클라이언트 예제파일 (0) | 2021.07.11 |
[Network] 9. FlatBuffers + Boost Asio 콘솔 클라이언트 예제 (1) (0) | 2021.07.09 |
[Network] 8. FlatBuffers + Boost Asio 콘솔 서버 예제 (4) (0) | 2021.07.08 |
[Network] 7. FlatBuffers + Boost Asio 콘솔 서버 예제 (3) (0) | 2021.07.07 |