buffer
boost::asio::buffer 함수는 원시(raw) 메모리, POD 요소의 배열, POD 요소의 벡터 또는 std::string을 나타내는 버퍼 생성에 사용된다.
주어진 버퍼에서 수정할 수 있는 새 버퍼를 생성한다.
mutable_buffer buffer( const mutable_buffer & b);
[buffer]
mutable_buffer buffer( const mutable_buffer & b, std::size_t max_size_in_bytes);
[buffer]
주어진 버퍼에서 수정할 수 없는 새 버퍼를 생성한다.
const_buffer buffer( const const_buffer & b);
[buffer]
const_buffer buffer( const const_buffer & b, std::size_t max_size_in_bytes);
[buffer]
주어진 메모리 범위를 나타내는 수정할 수 있는 새 버퍼를 생성한다.
mutable_buffer buffer( void * data, std::size_t size_in_bytes);
[buffer]
주어진 메모리 범위를 나타내는 수정할 수 없는 새 버퍼를 생성한다.
const_buffer buffer( const void * data, std::size_t size_in_bytes);
[buffer]
주어진 POD 배열을 나타내는 수정할 수 있는 새 버퍼를 생성한다.
template< typename PodType, std::size_t N> mutable_buffer buffer( PodType (&data)[N]);
[buffer]
template< typename PodType, std::size_t N> mutable_buffer buffer( PodType (&data)[N], std::size_t max_size_in_bytes);
[buffer]
주어진 POD 배열을 나타내는 수정할 수 없는 새 버퍼를 생성한다.
template< typename PodType, std::size_t N> const_buffer buffer( const PodType (&data)[N]);
[buffer]
template< typename PodType, std::size_t N> const_buffer buffer( const PodType (&data)[N], std::size_t max_size_in_bytes);
[buffer]
주어진 POD 배열을 나타내는 수정할 수 있는 새 버퍼를 생성한다.
template< typename PodType, std::size_t N> mutable_buffer buffer( boost::array< PodType, N > & data);
[buffer]
template< typename PodType, std::size_t N> mutable_buffer buffer( boost::array< PodType, N > & data, std::size_t max_size_in_bytes);
[buffer]
주어진 POD 배열을 나타내는 수정할 수 없는 새 버퍼를 생성한다.
template< typename PodType, std::size_t N> const_buffer buffer( boost::array< const PodType, N > & data);
[buffer]
template< typename PodType, std::size_t N> const_buffer buffer( boost::array< const PodType, N > & data, std::size_t max_size_in_bytes);
[buffer]
template< typename PodType, std::size_t N> const_buffer buffer( const boost::array< PodType, N > & data);
[buffer]
template< typename PodType, std::size_t N> const_buffer buffer( const boost::array< PodType, N > & data, std::size_t max_size_in_bytes);
[buffer]
주어진 POD 배열을 나타내는 수정할 수 있는 새 버퍼를 생성한다.
template< typename PodType, std::size_t N> mutable_buffer buffer( std::array< PodType, N > & data);
[buffer]
template< typename PodType, std::size_t N> mutable_buffer buffer( std::array< PodType, N > & data, std::size_t max_size_in_bytes);
[buffer]
주어진 POD 배열을 나타내는 수정할 수 없는 새 버퍼를 생성한다.
template< typename PodType, std::size_t N> const_buffer buffer( std::array< const PodType, N > & data);
[buffer]
template< typename PodType, std::size_t N> const_buffer buffer( std::array< const PodType, N > & data, std::size_t max_size_in_bytes);
[buffer]
template< typename PodType, std::size_t N> const_buffer buffer( const std::array< PodType, N > & data);
[buffer]
template< typename PodType, std::size_t N> const_buffer buffer( const std::array< PodType, N > & data, std::size_t max_size_in_bytes);
[buffer]
주어진 POD 벡터을 나타내는 수정할 수 있는 새 버퍼를 생성한다.
template< typename PodType, typename Allocator> mutable_buffer buffer( std::vector< PodType, Allocator > & data);
[buffer]
template< typename PodType, typename Allocator> mutable_buffer buffer( std::vector< PodType, Allocator > & data, std::size_t max_size_in_bytes);
[buffer]
주어진 POD 벡터을 나타내는 수정할 수 없는 새 버퍼를 생성한다.
template< typename PodType, typename Allocator> const_buffer buffer( const std::vector< PodType, Allocator > & data);
[buffer]
template< typename PodType, typename Allocator> const_buffer buffer( const std::vector< PodType, Allocator > & data, std::size_t max_size_in_bytes);
[buffer]
주어진 문자열을 나타내는 수정할 수 있는 새 버퍼를 생성한다.
template< typename Elem, typename Traits, typename Allocator> mutable_buffer buffer( std::basic_string< Elem, Traits, Allocator > & data);
[buffer]
template< typename Elem, typename Traits, typename Allocator> mutable_buffer buffer( std::basic_string< Elem, Traits, Allocator > & data, std::size_t max_size_in_bytes);
[buffer]
주어진 문자열을 나타내는 수정할 수 없는 새 버퍼를 생성한다.
template< typename Elem, typename Traits, typename Allocator> const_buffer buffer( const std::basic_string< Elem, Traits, Allocator > & data);
[buffer]
template< typename Elem, typename Traits, typename Allocator> const_buffer buffer( const std::basic_string< Elem, Traits, Allocator > & data, std::size_t max_size_in_bytes);
[buffer]
주어진 string_view를 나타내는 수정할 수 있는 새 버퍼를 생성한다.
template< typename Elem, typename Traits> const_buffer buffer( basic_string_view< Elem, Traits > data);
[buffer]
주어진 string_view를 나타내는 수정할 수 없는 새 버퍼를 생성한다.
template< typename Elem, typename Traits> const_buffer buffer( basic_string_view< Elem, Traits > data, std::size_t max_size_in_bytes);
[buffer]
버퍼 개체는 포인터와 크기(바이트)로 구성된 2-튜플(tuple:단위를 나타냄)로서 메모리의 연속적인 영역을 나타낸다. {void*, size_t} 유형의 튜플(tuple)은 메모리의 변경 가능한(수정 가능한) 영역을 지정한다. 마찬가지로 {const void*, size_t} 유형의 튜플(tuple)은 메모리의 const(수정 불가능한) 영역을 지정한다. 이 두 유형은 각각 mutable_buffer와 const_buffer 클랙스에 해당한다. C++의 변환 규칙을 반영하기 위해 mutable_buffer는 암시적으로 const_buffer로 변환할 수 있으며, 반대의 변환은 허용되지 않는다.
가장 간단한 사용 사례는 지정된 크기의 단일 버퍼를 읽거나 쓰는 것이다:
sock.send(boost::asio::buffer(data, size));
위의 예에서 boost.::asio::buffer의 반환 값은 ConstBufferSequence 개념의 요구 사항을 충족하므로 소켓의 쓰기 함수오 바로 전달될 수 있다. 또한 수정할 수 있는 메모리로 만들어진 버퍼도 MutableBufferSequence 개념의 요구 사항을 충족한다.
개별 버퍼는 내장 배열, std::vector, std::array 또는 POD 요소의 boost::array에서 생성될 수 있다. 이렇게 하면 버퍼 크기를 자동으로 결정하여 버퍼 오버런을 방지할 수 있다.
char d1[128]; size_t bytes_transferred = sock.receive(boost::asio::buffer(d1)); std::vector<char> d2(128); bytes_transferred = sock.receive(boost::asio::buffer(d2)); std::array<char, 128> d3; bytes_transferred = sock.receive(boost::asio::buffer(d3)); boost::array<char, 128> d4; bytes_transferred = sock.receive(boost::asio::buffer(d4));
위의 세 가지 경우 모두, 생성된 버퍼 길이는 정확하게 128 바이트이다. 주의할 점은 벡터는 버퍼를 만들거나 사용할 때 자동으로 크기가 조정되는 않는다. 버퍼 크기는 용량이 아니라 벡터의 size() 멤버 함수를 사용해 결정된다.
버퍼 내용에 접근
버퍼의 내용은 data()와 size() 멤버 함수를 사용해 접근할 수 있다:
boost::asio::mutable_buffer b1 = ...; std::size_t s1 = b1.size(); unsigned char* p1 = static_cast<unsigned char*>(b1.data()); boost::asio::const_buffer b2 = ...; std::size_t s2 = b2.size(); const void* p2 = b2.data();
dat() 멤버 함수는 유형 안정성 위반을 허용하므로, 응용 프로그램 코드에서 data()의 사용은 신중하게 고려되어야 한다.
편의를 위해, 버퍼와 버퍼 시퀀스(즉, ConstBufferSequence 또는 MutableBufferSequence 유형 요구 사항을 충족하는 유형) 둘 다 작동하는 buffer_size 함수가 제공된다. 이 경우 함수는 시퀀스에 포함된 모든 버퍼의 전체 크기를 반환한다.
버퍼 복사
buffer_copy 함수는 개별 버퍼와 버퍼 시퀀스 간에 원시(raw) 바이트를 복사하는 데 사용할 수 있다.
특히 buffer_size 함수와 사용할 경우, buffer_copy 함수는 버퍼 시퀀스를 선형화하는 데 사용할 수 있다. 예를 들면:
vector<const_buffer> buffers = ...; vector<unsigned char> data(boost::asio::buffer_size(buffers)); boost::asio::buffer_copy(boost::asio::buffer(data), buffers);
buffer_copy 함수는 memcpy 기반으로 구현되므로 겹치는 메모리 영역 간에 복사 작업에 사용할 수 없다.
버퍼 무효화
버퍼 개체는 참조하는 메모리의 소유권이 없다. 더 이상 I/O 작업이 필요하지 않을 때까지 메모리 영역이 유효하게 남아있도록 보장하는 것은 응용 프로그램의 책임이다. 메모리를 더 이상 사용할 수 없으면, 버퍼가 무효화되었다고 한다.
std::vector 유형의 인수를 허용하는 boost::asio::buffer 오버로드의 경우, 반환된 버퍼 개체는 시퀀스의 요소를 참조하는 모든 참조, 포인터와 반복기(iterator)를 무효화하는 벡터 연산에 의해 무효화된다. (C++ Std, 23.2.4)
std::basic_string 유형의 인수를 허용하는 boost::asio::buffer 오버로드의 경우, 반환된 버퍼 개체는 시퀀스의 요소를 참조하는 참조, 포인터와 반복기(iterator)의 무효화 정의 규칙에 따라 무효화된다. (C++ Std, 21.3)
버퍼 산술연산
버퍼 개체는 버퍼 오버런을 방지하는 안전한 방식으로 간단한 산술 연산을 처리할 수 있다. 다음과 같이 초기화된 배열을 고려한다:
boost::array<char, 6> a = { 'a', 'b', 'c', 'd', 'e' };
버퍼 개체 "b1"은 다음을 사용하여 생성하고:
b1 = boost::asio::buffer(a);
전체 배열 {'a', 'b', 'c', 'd', 'e'}를 나타낸다. boost::asio::buffer 함수에 대한 선택적인 두 번째 인수를 사용하여 버퍼의 크기(바이트 단위)를 제한할 수 있다.
b2 = boost::asio::buffer(a, 3);
"b2"는 데이터 {'a', 'b', 'c'}를 나타낸다. "size" 인수가 배열의 실제 크기를 초과하더라도 생성되는 버퍼 개체의 크기는 배열 크기로 제한된다.
오프셋을 주어진 버퍼에 적용하여 새 버퍼를 만들 수 있다:
b3 = b1 + 2;
여기서 "b3"은 {'c', 'd', 'e'}를 나타내도록 설정된다. 오프셋이 주어진 버퍼의 크기를 초과하면, 새로 생성된 버퍼는 비어 있을 것이다.
오프셋과 크기를 모두 지정하여 주어진 버퍼내에서 특정 범위의 바이트에 해당하는 버퍼를 만들 수 있다:
b4 = boost::asio::buffer(b1 + 1, 3);
따라서 "b4"는 {'b', 'c', 'd'} 바이트를 참조한다.
버퍼와 분산-수집(Scatter-Gather) I/O
다중 버퍼(예: 분산-수집 I/O)를 사용하여 읽거나 쓰려면, 다중 버퍼 개체를 MutableBufferSequence(읽기용) 또는 ConstBufferSequence(쓰기용) 개념을 지원하는 컨테이너에 할당할 수 있다:
char d1[128]; std::vector<char> d2(128); boost::array<char, 128> d3; boost::array<mutable_buffer, 3> bufs1 = { boost::asio::buffer(d1), boost::asio::buffer(d2), boost::asio::buffer(d3) }; bytes_transferred = sock.receive(bufs1); std::vector<const_buffer> bufs2; bufs2.push_back(boost::asio::buffer(d1)); bufs2.push_back(boost::asio::buffer(d2)); bufs2.push_back(boost::asio::buffer(d3)); bytes_transferred = sock.send(bufs2);
요구 사항
일반 헤더: boost/asio/buffer.hpp
편의 헤더: boost/asio.hpp
Boost.Asio 홈
'Boost C++ Libraries > Boost.Asio' 카테고리의 다른 글
Boost.Asio 색인 - buffered_stream::buffered_stream (0) | 2021.01.13 |
---|---|
Boost.Asio 색인 - buffered_read_stream::buffered_read_stream (0) | 2021.01.13 |
Boost.Asio 색인 - socket_base::broadcast (0) | 2021.01.12 |
Boost.Asio 색인 - ip::network_v4::broadcast (0) | 2021.01.12 |
Boost.Asio 색인 - ip::address_v4::broadcast (0) | 2021.01.12 |