boost
-
pyd 파일 없이 c++과 python 연동하기프로그래밍/c++ 2015. 11. 20. 05:44
pyd 파일 만들지 않고 c++과 Python 연동하기 서버 코드에 일부 변동될 수 있는 부분들을 스크립트로 빼고 싶었다. 유저 accept를 할 포트, 최대 유저 수, 방 인스턴스 수 등등.. 부터,특정 상황마다 콜백이 불려서 뭔가를 체크하는 간단한 행동 정도면 오케이.그리고 석찬이 형이 테스트 할 부분을 스크립트로 빼면, 형도 부담 없이 이런저런 수치를 바꿔보며 테스트를 할 수도 있고, 나는 다른 작업을 할 수 있으니까 편할 것이다. 고작 졸업 프로젝트 정도인데? 라고도 생각할 사람도 있겠지만, 다른 스킬들을 익혀봐야 나쁠 거 없으니까. 여튼, 단순히 변수의 값을 설정하는 정도라면 텍스트 파일 정도로만 빼도 상관이 없었지만 약간의 처리 로직까지 첨부가 되어야한다면 텍스트 파일 정도로는 부족한 걸 사실..
-
boost::asio의 송신 함수. async_write, async_write_some, async_send의 차이프로그래밍/c++ - boost::asio 2015. 11. 10. 06:30
boost::asio::async_write asio 전역 함수로, 버퍼의 내용물을 모두 전송했을 때 완료 함수를 호출한다. 이 함수가 일반적으로 사용되는 송신 함수이다. boost::asio::ip::tcp::socket::async_write_some tcp 소켓의 멤버 함수,로 버퍼 내용을 일부라도 보냈다면 완료 함수가 호출된다. 일부만 전송되는 경우는 자주 발생하진 않지만, 네트워크 상황이 아주 안 좋을 경우 일어날 수 있다.만약, async_write_some으로 데이터 송신 부분을 작성하려면 송신 버퍼의 바이트 수와 송신 바이트 수가 일치할 때까지 async_write_some을 반복 호출해야 할 것이다. boost::asio::ip::tcp::socket::async_send tcp 소켓의 ..
-
boost::asio::streambuf에 custom memory allocator 붙이기프로그래밍/c++ - boost::asio 2015. 11. 7. 09:00
boost::asio::streambuf의 메모리 할당자로 boost::pool_allocator를 사용하려고 했다. 근데... 보이는 것처럼 인자로 std::allocator를 복사로 받을 뿐, custom allocator를 지원하지 않게 되어있다. 하지만 asio의 streambuf가 커스텀 메모리 할당자를 지원하지 않는다는 게 이상해서 좀 더 찾아보니, boost::asio::basic_streambuf가 템플릿 인자로 메모리 할당자를 받더라. 다음은 basic_streambuf에 pool_allocator를 조합한 모습이다. streambuf의 정의를 찾아보면, basic_streambuf의 할당자가 std::allocator로 설정이 되어있을 뿐이라는 것을 알 수 있다. 따라서, 모든 boos..
-
boost::uuids::uuid를 std::unordered_map과 사용하기프로그래밍/c++ 2015. 11. 5. 02:55
uuid(universal unique identifier)는 객체의 식별 등에 사용되는 고유한 식별자이다. 식별을 위한 정수 값 0, 1, 2 등의 것을 심화시킨 것이라고 생각해도 무관. 자세한 설명은 http://terms.naver.com/entry.nhn?docId=850737&cid=42346&categoryId=42346 12345678910111213141516171819#pragma warning(disable : 4996) #include #include #include using uuid_hasher = boost::hash;/* c++11 이하 버전에선 typedef boost::hash uuid_hasher*/ int main(){ std::unordered_map uuidmap; ..
-
다양한 데이터 타입의 변수. boost::variant프로그래밍/c++ 2015. 11. 2. 11:12
boost::variant는 템플릿 파라미터로 명시된 타입들 중 하나를 데이터로 가질 수 있는 클래스이다.한마디로 업그레이드 된 union. 힙을 사용하지도 않고, RTTI도 이용하지 않아 좋은 성능을 보여준다. 간단한 사용 예 boost::variant var; // int, std::string, float 타입들을 담을 수 있는 변수. var = "Hello";var = 0;var = 1.0f; 값을 읽어오는 방법 template boost::get 를 사용한다. 잘못된 변환을 하려고 한다면? boost::bad_get 예외를 던진다. boost::get(var); // std::string 타입으로 읽는다.boost::get(var); // 잘못된 코드! boost::bad_get 예외가 발생한다..
-
boost::asio deadline_timer를 이용한 유니티의 Invoke함수 흉내 내기프로그래밍/c++ - boost::asio 2015. 9. 28. 05:10
전에 유니티 엔진을 잠깐 들여다보는데, Invoke라는 함수가 참 마음에 들었었던 기억이 있다. 그리고 후에 asio를 알아보던 중, deadline_timer라는 클래스를 제공한다는 걸 알았는데,이걸 이용하면 유니티의 Invoke를 흉내낼 수 있을 거 같단 생각이 들었다. 다음은 deadline_timer를 이용한 예제.. 1234567891011121314151617181920212223242526272829303132333435#include #include using namespace boost; asio::io_service service;asio::io_service::work work(service); // io_service의 run이 종료되지 않게 해주는 개체 void invoke(lon..
-
boost::asio 완료 핸들러에 제네릭 람다 사용 시 있었던 문제프로그래밍/c++ - boost::asio 2015. 9. 17. 17:34
컴파일 타임에 오류가 나는데 잡기가 꽤 어려웠다. 문제의 코드를 보자. 123456789101112131415161718192021 tcp_socket.async_receive( buffer_write_section, receive_complete_handler); [this](const auto& error, size_t bytes_transferred) { if (error) { this->on_error(error); return; } this->receive_buffer.commit(bytes_transferred); // 버퍼의 읽기 부분을 추출. auto read_section = this->receive_buffer.data(); auto read_data = asio::buffer_cast..
-
boost::asio::streambuf 분석..프로그래밍/c++ - boost::asio 2015. 9. 15. 15:13
이전에는 수신 버퍼를 직접 만들어서 쓰고 있었다. 수신 버퍼의 이름은 StreamBuffer -_- boost::asio::streambuf를 수신 버퍼로 쓰는 코드들을 c++ 오픈소스 그룹 커뮤니티에서 보았다. streambuf는 뭐지? 뭔가 편해 보이는데.. 이름도 streambuf인걸 보면 소켓 송수신에 쓰일 버퍼로 쓰라고 만들어놓은 거 같길래 여기저기서 코드 사용 예를 살펴보다가 이전에 내가 직접 만들었던 StreamBuffer와 뭔가 비슷하다고 느껴서 코드 내부를 직접 보게 됨 ** 정의 std::streambuf를 상속 받는다. 복사가 불가능 함(boost::noncopyable 상속) 커스텀 할당자를 지원함 ** 생성 최대 크기(maximum_size) 인자를 지정해주지 않으면 std::nu..