프로그래밍/c++ - boost::asio
-
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::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..