Thinking Different




이제 마지막으로 클라이언트 코드의 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;
}