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 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..
-
asio udp client 작업 중 람다 캡처를 잘못 사용한 문제프로그래밍/의문 2015. 7. 14. 18:51
123456789101112131415161718void UdpClient::Send(const ip::udp::endpoint& endpoint, const void* source, size_t bytes){ std::vector sendBuffer; sendBuffer.resize(bytes); std::memcpy(sendBuffer.data(), source, bytes); socket.async_send_to( buffer(sendBuffer.data(), sendBuffer.size()), // send data endpoint, [this, buf = std::move(sendBuffer)](const boost::system::error_code& error, size_t bytes){ /..
-
수신 오류로 착각한 송신 오류프로그래밍/의문 2015. 6. 10. 05:18
// 2015/06/10 ReceiveStream에서 오류가 있어서 콜백함수 호출때 프로그램이 뻗는 오류가 발견되었다.(오류0)// 오류0에 대한 해결: OnSessionReceive에서 데이터를 처리하고 세션으로 다시 Send를 하는데 그 부분에서 오류가 있었다. 메모리의 잘못된 사용으로 인한 오류였다. 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 void Session::Receive() { // /** @note: Receive 함수의 구현 중점(2015/06/05) * 0. 데이터의 복사를 최소화: Receive 버퍼를 그대로 이용할 수 있다면 그대로 이용한다. * 1. 신경 쓸 필요 없는..