[C++] 채팅서버에 DB 실장
·
Study/C++ & C#
하기는 금방 했는데, 인생 한 치 앞을 알 수가 없게 돼서 이제야 올린다.  1. DB 설치MariaDB를 사용하기로 했다.Sapphire 프로젝트에서 MariaDB를 사용하고 있기도 하고,나중에 샤딩을 위해서도 좋지 않을까 싶었다. C++에서 마리아 DB와 연동하기 위해선 MariaDB Connector/C++가 필요하다.설치 후 포함 및 라이브러리 경로를 프로젝트 설정에서 잡아주면 끝.  2. DB 구조 잡기유저들은 무작위 16진수 문자열 배열을 ID이자 닉네임으로 사용하게 된다.로그인도 필요 없고 서버에서 임의로 부여한다.오고 가는 것은 클라이언트가 접속했는지, 어떤 채팅을 쳤는지 정도일 뿐이다. 사용자 정보 - 부여받은 ID - IP 주소 - 최초/최근 접속 시간대화 정보 - 메시지를 보낸 사용자..
[C#] ###Clicker 동작 개선
·
Study/C++ & C#
https://u-bvm.tistory.com/91 [C#] ###Clicker 개선판개선은 진작 했지만, 관련해서 포스팅하지 않은 이유는 "티스토리 계정을 까먹어서..." 자동 로그인 해둔 것들은 포맷 후에 다시 로그인해야 하니 여간 귀찮은 일이 아니다. 어찌어찌 로그인해서u-bvm.tistory.com여기에서 이어진다.  최근에 돌리면서 마음에 안 드는 부분이 좀 있었기 때문에 고쳐보고자 했다. 파이어폭스 지원 - 크롬이 자원을 많이 먹는다는 느낌이 들어서 파폭이라면 괜찮지 않을까 싶었다.URL 캐싱 - 아무래도 지금까지의 방식으론 이미 클릭해서 포인트를 얻을 수 없는 부분도 클릭을 계속하기 때문에 - 불필요한 부하를 만들고 있다고 생각했다. - 사실 처음 만들 때부터 의도한 부분이긴 한데, 하다 보..
[C++] ChatRoom 구현
·
Study/C++ & C#
본격적으로 채팅 시스템을 만들어 보기 위한 기초 작업이라고 봐도 되겠다. 이전과의 차이점은 아래와 같다. Session 정의 변경 - 이제 세션은 서버와 클라이언트 간의 연결 상태를 나타낸다. - 기존 Room처럼 쓸 수 없고 단일 연결을 나타낸다. ChatServer 구현 - io_context를 가지고 전체 서버를 관리할 객체 - 이후에 io_context를 활용하는 객체들은 전부 이 객체로부터 레퍼런스를 받는다. ChatRoom 구현 - ChatServer 아래에서 실제 채팅방의 역할을 할 객체 핸들러 구현 - 메세지 핸들링을 분리해 코드 관리를 용이하게 할 목적으로 별도 클래스로 구현 1. Session #ifndef SESSION_H_ #define SESSION_H_ #include #incl..
[C++] Session 다중 접속
·
Study/C++ & C#
이전에 에코서버를 만들어 봤었는데, 그건 세션 당 하나의 소켓만 처리할 수 있었다. 이걸 하나의 세션에서 여러 개의 소켓을 처리할 수 있게 수정했다. 하물며 채팅에서도 1:1 채팅만 하는 것은 아니지 않은가. 1. Server Server 클래스 자체는 거의 원형을 유지하고 있다. class Server { public: Server(boost::asio::io_context& io_context, short port) : io_context_(io_context), acceptor_(io_context, tcp::endpoint(tcp::v4(), port)), session_(std::make_shared(io_context)) { DoAccept(); } private: boost::asio::io..
[C++] Boost.Asio 에코 서버
·
Study/C++ & C#
Sapphire라는 FF14의 서버를 에뮬레이팅 하는 프로젝트가 있다. 개발사가 사용하는 실제 서버 코드와 동일할 수는 없겠지만, 기본적인 처리는 되어 있기에 이를 통해 나만의 세계에서 FF14를 탐험할 수 있다. 에뮬레이팅 된 서버가 클라이언트와 정상적으로 통신하고 있으며, 서버도 적절한 처리를 해 준다는 의미이다. 그리고 난 이 프로젝트에 사용된 Boost.Asio가 매우 궁금해졌다. 이를 처음부터 공부하며 이 프로젝트에 사용된 비동기 통신 개념을 진정 나의 것으로 만들기 위한 첫걸음을 떼려고 한다. 그전에 Boost.Asio에 대해 알 필요가 있다. 이 글에서 그 내용을 설명할 수도 있지만, 매우 잘 설명해 준 어떤 블로그의 글을 발견해 링크를 남긴다. Boost Asio에 대해서 알아보자 물론 공..
[C#] ###Clicker 개선판
·
Study/C++ & C#
개선은 진작 했지만, 관련해서 포스팅하지 않은 이유는 "티스토리 계정을 까먹어서..." 자동 로그인 해둔 것들은 포맷 후에 다시 로그인해야 하니 여간 귀찮은 일이 아니다. 어찌어찌 로그인해서 쓴다. 이전과의 차이점 자격증명 체크 개선 프로세스 생명주기 관리 개선 진행상황 트래킹 개선 이터레이션 처리 개선 일부 클래스 개선 1. 자격증명 체크 개선 포맷으로 인해 기존 암호회 데이터를 사용하지 못하게 됐으니, 새로운 데이터를 만들 필요가 있다. 그래서 난 "어차피 실행해서 로그인이 불가능하면 새로운 자격증명을 입력하면 된다"라는 생각으로 실행했다. 하지만 이전 버전에서는 각 스레드마다 로그인 체크를 하기 때문에 모든 스레드가 동시에 새로운 자격증명 입력 요구를 하게 되는 상황이 발생했다. 몇 번이고 그걸 입..
[C#] 심플한 게임 런처
·
Study/C++ & C#
내가 하는 모 게임은 게임을 구동하기 위해 런처에서 로그인 후 게임을 실행해야 한다. 그리고 그 과정은 대단히 귀찮다. 심지어 난 비밀번호가 크롬에서 자동생성 해주는 복잡한 그거라 일일이 크롬에서 그걸 가져왔다. 그게 귀찮다고 다른 데 메모해 두면 보안의 의미가 없으니까... 그래서 이 번거로운 과정을 건너뛰고 한방에 게임을 켜고 싶었다. 계정의 세션ID는 변경되지 않고 고유하며, 게임 실행 시에 그 인자로 들어간다. 이를 포함한 정보를 저장했다가 다시 불러와 사용할 수 있게 하고 싶었던 것. 이전에 내가 의도하는 기능을 하는 어떤 개인 개발 프로그램이 있었는데, 유감스럽게도 소스코드나 .pdb 파일이 없었기 때문에 이를 리버싱 할 필요가 있었다. 프로그램을 디컴파일하고, 그 코드를 보기 좋게 고친 다음..
[C#] ###Clicker
·
Study/C++ & C#
모 웹사이트는 페이지에 있는 어떤 영역을 클릭하면, 그 사이트 내에서 사용할 수 있는 재화를 지급한다. 하지만 그 영역의 수가 결코 적지 않다. 일일이 클릭하기에 꽤 번거로운 양이고 특정 주기로 갱신 또한 이루어진다. 이제 자동화로 편해져 보려 한다. 하지만 여기선 클릭 자동화에 대한 얘기 보단 다른 걸 설명하려고 한다. 그런 자동화는 다른 데 더 좋은 설명이 많다. 1. Main 프로그램의 주요 동작만 알아보기 위해 Main()만 가져왔다. /// /// Holds constant values to be used throughout the application for configuration purposes. /// static class Constants { /// /// Maximum number ..
[C#] 자동화 플러그인 수정
·
Study/C++ & C#
근래에 FFXIV 무인도 컨텐츠의 자동화를 도와주는 플러그인을 발견했기에 당장 써보기로 결정했다. 재미있지도 않은 미친 노가다를 안 할 수 있다니 혹하지 않을 수 있을까. 채집 노드를 알아서 따라가며 지정한 루트는 잘 돌아주지만 다른 문제가 있었으니... 1. 클라이언트 언어의 차이 무인도엔 "워크샵"이라는 컨텐츠가 있고, 각 사이클마다 상품 생산을 예약하고 생산 및 판매해 고유 화폐를 얻는 식으로 구성되어 있다. 최고 효율을 얻는 상품 생산 구성을 매 사이클마다 제공해 주는 디스코드가 있는데, 아이템 이름을 영어로만 제공한다. 저 포맷을 그대로 복사해 플러그인에 붙여 넣기 하면, 플러그인이 알아서 아이템 이름만 뽑아내 게임 데이터와 일치하는지 확인한 후 생산 예약에 등록하는 식으로 작동한다. # 위는 ..
[C++ / Python / DB] ProcedureGenerator
·
Study/C++ & C#
이전에 Protobuf를 사용한 패킷 핸들러를 자동화할 때와 동일하게, Python과 Jinja2를 활용할 것이다. 1. XML 파서 작성 서버 소스가 아니라 Python에서 사용할 XML 파서를 작성해야 한다. import xml.etree.ElementTree as ET class XmlDBParser: def __init__(self): self.tables = {} self.procedures = [] def parse_xml(self, path): tree = ET.parse(path) root = tree.getroot() for child in root: if child.tag == 'Table': self.tables[child.attrib['name']] = Table(child) for..